Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Невозможно обратится к private члену

75K
26 октября 2011 года
reclearerr
2 / / 09.10.2011
Собственно, требуется построить прямоугольник, используя псевдографику консоли и классы. Вот код:
Код:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

enum CHOICE{DrawRect = 1, GetArea, GetPerim, ChangeDimensions, Quit};

//Rectangle class declaration
class Rectangle
{
    Rectangle(unsigned int width, unsigned int height);
    ~Rectangle();

    //access methods:
public:
    unsigned int GetHeight() const {return itsHeight;}
    unsigned int GetWidth() const {return itsWidth;}
    unsigned int GetArea() const {return itsHeight*itsWidth;}
    unsigned int GetPerim() const {return 2*(itsHeight+itsWidth);}
    void SetSize(unsigned int newWidth, unsigned int newHeight);

    //other methods:
private:
    unsigned int itsWidth, itsHeight;
};

//class methods execution
void Rectangle::SetSize(unsigned int newWidth, unsigned int newHeight)
{
    itsWidth = newWidth;
    itsHeight = newHeight;
}

Rectangle::Rectangle(unsigned int width, unsigned int height)
{
    itsWidth = width;
    itsHeight = height;
}

Rectangle::~Rectangle() {}

unsigned short int DoMenu();
void DoDrawRect(Rectangle);
void DoGetArea(Rectangle);
void DoGetPerim(Rectangle);

void main(int argc, char* argv[])
{
    //object "rectangle" initialization (30, 5)
    Rectangle theRect(30, 5);

    unsigned short int choice = DrawRect;
    bool fQuit = false;

    while (!fQuit)
    {
        choice = DoMenu();

        if (choice < DrawRect || choice > Quit)
        {
            cout << "\nInvalid choice, please try again.\n\n";
            continue;
        }
       
        switch (choice)
        {
        case DrawRect:
            DoDraw(theRect);
            break;
        case GetArea:
            DoGetArea(theRect);
            break;
        case GetPerim:
            DoGetPerim(theRect);
            break;
        case ChangeDimensions:
            unsigned int newWidth, newHeight;
            cout << "\nNew width: ";
            cin >> newWidth;
            cout << "\nNew height: ";
            cin >> newHeight;
            theRect.SetSize(newWidth, newHeight);
            DoDrawRect(theRect);
            break;
        case Quit:
            fQuit = true;
            cout << "\nExiting...\n\n";
            break;
        } //end switch
    } //end while
    system("PAUSE");
} //end main

unsigned short int DoMenu()
{
    unsigned short int choice;

    cout << "\n\n***Menu***\n";
    cout << "(1) Draw rectangle\n";
    cout << "(2) Area\n";
    cout << "(3) Perimeter\n";
    cout << "(4) Resize\n";
    cout << "(5) Quit\n";

    cin >> choice;
    return choice;
}

void DoDrawRect(Rectangle theRect)
{
    unsigned int height = theRect.GetHeight();
    unsigned int width = theRect.GetWidth();

    for (unsigned short int i = 0; i < height; i++)
    {
        for (unsigned short int j = 0; j < width; j++)
            cout << "*";
        cout << "\n";
    }
}

void DoGetArea(Rectangle theRect)
{
    cout << "Area: " << theRect.GetArea() << endl;
}

void DoGetPerim(Rectangle theRect)
{
    cout << "Perimeter: " << theRect.GetPerim() << endl;
}


Выдает такие ошибки:
Цитата:
i:\projects\liberty\rectangle.cpp(50): error C2248: Rectangle::Rectangle: невозможно обратиться к private член, объявленному в классе "Rectangle"
1> i:\projects\liberty\rectangle.cpp(11): см. объявление "Rectangle::Rectangle"
1> i:\projects\liberty\rectangle.cpp(10): см. объявление "Rectangle"
1>i:\projects\liberty\rectangle.cpp(50): error C2248: Rectangle::~Rectangle: невозможно обратиться к private член, объявленному в классе "Rectangle"
1> i:\projects\liberty\rectangle.cpp(12): см. объявление "Rectangle::~Rectangle"
1> i:\projects\liberty\rectangle.cpp(10): см. объявление "Rectangle"
1>i:\projects\liberty\rectangle.cpp(68): error C3861: DoDraw: идентификатор не найден
1>i:\projects\liberty\rectangle.cpp(110): error C2248: Rectangle::~Rectangle: невозможно обратиться к private член, объявленному в классе "Rectangle"
1> i:\projects\liberty\rectangle.cpp(12): см. объявление "Rectangle::~Rectangle"
1> i:\projects\liberty\rectangle.cpp(10): см. объявление "Rectangle"
1>i:\projects\liberty\rectangle.cpp(123): error C2248: Rectangle::~Rectangle: невозможно обратиться к private член, объявленному в классе "Rectangle"
1> i:\projects\liberty\rectangle.cpp(12): см. объявление "Rectangle::~Rectangle"
1> i:\projects\liberty\rectangle.cpp(10): см. объявление "Rectangle"
1>i:\projects\liberty\rectangle.cpp(128): error C2248: Rectangle::~Rectangle: невозможно обратиться к private член, объявленному в классе "Rectangle"
1> i:\projects\liberty\rectangle.cpp(12): см. объявление "Rectangle::~Rectangle"
1> i:\projects\liberty\rectangle.cpp(10): см. объявление "Rectangle"



Методы доступа к членам класса задал же, в чем проблема?
З.Ы. начинающий, сильно не ругайте)

75K
26 октября 2011 года
reclearerr
2 / / 09.10.2011
Тьфу ты, поспешил я с просьбой о совете. Всегото нужно было поставить public: перед конструктором..
Теперь другой вопрос. как реализовать проверку вводимых значений?
Если при
 
Код:
if (choice < DrawRect || choice > Quit || !choice)
        {
            cout << "Invalid choice, please reload program.\n";
            continue;
        }


ввести букву, то программа выдаст строку и зависнет.
277
26 октября 2011 года
arrjj
1.7K / / 26.01.2011
 
Код:
choice = DoMenu();

        while(choice < DrawRect || choice > Quit)
        {
            cout << "\nInvalid choice, please try again.\n\n";
choice = DoMenu();
        }

Хотя я бы проверку сделал в DoMenu();
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог