Конструктор не может получить доступ к закрытым членам своего собственного класса

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

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

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;
}

person Epsilon Vector    schedule 07.06.2009    source источник


Ответы (3)


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

class Town{
public: // <- add this
    Town(int number):number(number){};
    ...
private: 
    int number;
};
person David Rodríguez - dribeas    schedule 07.06.2009

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

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

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

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

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

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

person Ryan Christensen    schedule 07.06.2009
comment
+1 за общую идею. Но, хотя это и распространено, вы не должны ставить префикс подчеркивания «_», поскольку стандарт резервирует эти имена для «реализации», где реализация — это компилятор/реализатор STL. Вы также можете использовать this в C++ так же, как и self в python, чтобы отличить атрибут от других идентификаторов (локальных переменных/параметров). - person David Rodríguez - dribeas; 08.06.2009

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

Город (число): число (число) {};

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

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

person Hans    schedule 07.06.2009
comment
Список инициализации немного отличается в этом отношении. Параметр с тем же именем не будет скрывать атрибут в списке инициализации. Параметр будет скрывать имя атрибута везде, где это возможно. Когда компилятор встречает ': number(number)', первое 'number' должно быть атрибутом для компилируемого кода. Второе «число» может быть любым, и параметр скрывает атрибут там (как и везде внутри блока конструктора). Но код операции правильный. - person David Rodríguez - dribeas; 07.06.2009