Вложенный класс 'доступ к закрытому классу' члены личных данных
У меня возникают проблемы с реализацией вложенного класса, конструктор которого инициализируется с некоторыми частными данными-членами этого класса.
Пример:
Header File:
class Enclosing {
//...Public members
//...Private members
int x, int y
class Inner; // Declaration for nested class
};
Impl. File:
// Stuff...
class Enclosing::Inner {
explicit Inner() : foo(x), bar(y) // foo and bar are data members of Inner
//...
};
Я получаю invalid use of non-static data member
ошибка. Есть ли что-то, чего мне не хватает, когда дело доходит до доступа вложенного класса к членам включающего класса?
3 ответа
Член x
а также y
не являются статическими членами данных Enclosing
Это означает, что они существуют только в конкретном объекте Enclosing
учебный класс. Без конкретного объекта, ни x
ни y
существовать. Тем временем вы пытаетесь сослаться на x
а также y
без объекта. Это не может быть сделано, о чем вам и говорит компилятор.
Если вы хотите инициализировать членов Inner::foo
а также Inner::bar
от x
а также y
Вы должны передать конкретный объект Enclosing
введите в Inner
конструктор Например
class Enclosing::Inner {
explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y)
{}
//...
};
Дополнительное примечание: в оригинальном C++98 внутренний класс не имеет особых привилегий доступа к внешнему классу. С компилятором C++98 вы должны либо дать внутреннему классу необходимые привилегии (дружба), либо выставить членов x
а также y
как общедоступный. Однако эта ситуация была классифицирована как дефект в C++98, и было решено, что внутренние классы должны иметь полный доступ к внешним элементам класса (даже частным). Итак, нужно ли вам что-то делать с правами доступа, зависит от вашего компилятора.
Проблема с вашим кодом заключается не в видимости, как указал AndreyT, а в том, что Inner
класс не привязан к конкретному экземпляру Enclosing
учебный класс. Другими словами, при построении Inner
компилятор не может знать, какой объект взять x
а также y
значения от.
Вы должны будете явно предоставить экземпляр Enclosing
класс для конструктора Inner
класс как так:
class Enclosing
{
private:
int x;
int y;
class Inner
{
private:
int foo;
int bar;
public:
explicit Inner(const Enclosing& e)
: foo(e.x), bar(e.y)
{ }
};
};
Вложенный класс не может получить доступ к элементу данных privet включающего class.compiler, если при попытке получить доступ к члену privet включающего класса, он может получить доступ только к общедоступному члену данных класса включения.....