Конструктор не может получить доступ к закрытым членам своего класса - PullRequest
3 голосов
/ 07 июня 2009

Я получаю следующую ошибку в Visual Studio 2008: ошибка C2248: 'Town :: Town': невозможно получить доступ к закрытому члену, объявленному в классе 'Town'. Похоже, конструктор не может получить доступ к членам своего класса. Есть идеи, что происходит? Вот код:

У меня есть это:

template<class T> class Tree{...}

И этот класс:

class Town{
    Town(int number):number(number){};
    ...
private: 
    int number;
};

Что используется в этом классе:

class Country{
public:
    StatusType AddTown(Shore side, int location, int maxNeighborhoods);
private:
    Tree<Town> towns[2];
    ...
}

А вот функция AddTown:

StatusType Country::AddTown(Shore side, int location, int maxNeighborhoods){
    if (maxNeighborhoods<0 || location<0){
        return INVALID_INPUT;
    }
    Town* dummy= new Town(location);//Here be error C2248
    if (towns[side].find(*dummy)!=NULL){
        delete dummy;
        return FAILURE;
    }
    SouthBorder* dummyBorder;
    (side==NORTH)?dummyBorder=new SouthBorder(location,0):dummyBorder=new SouthBorder(0,location);
    if (southBorders.find(*dummyBorder)!=NULL){
        delete dummyBorder;
        return FAILURE;
    }
    towns[side].add(*dummy);
    delete dummyBorder;
    return SUCCESS;
}

Ответы [ 3 ]

12 голосов
/ 07 июня 2009

По умолчанию уровень доступа класса является частным. Если вы не добавите public: перед конструктором Town он будет закрытым.

class Town{
public: // <- add this
    Town(int number):number(number){};
    ...
private: 
    int number;
};
3 голосов
/ 07 июня 2009

В этом коде были обе логические проблемы, перечисленные выше. И непубличное объявление, и скрытие переменных-членов с использованием того же имени, что и внутреннее.

Учитывая, что мы говорим о переменной 'number' в качестве примера.

Раньше, например, в переменных-членах c ++, которые были частными внутренними переменными, префиксом был 'm_number'. Или кто-то сделал бы просто «_number».

Просто 'num' - это хорошее переименование, но может быть не совсем понятно, что это то же самое значение. Я полагаю, что это проблема именования внутренних закрытых переменных, которая на самом деле не решена.

Python использует «self.number», который будет отличаться от «number», переданного в качестве приемлемого решения.

Но какой бы ни была платформа, всегда хорошо иметь систему именования членов с частными переменными, которая поможет вам избежать взломов в точках, где у вас есть конфликты имен.

0 голосов
/ 07 июня 2009

Вы объявили локальную переменную для функции, которая скрывает переменную-член:

Город (целое число): номер (число) {};

Попробуйте вместо этого

Town(int num):number(num){};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...