Вложенный класс 'доступ к закрытому классу' члены личных данных

У меня возникают проблемы с реализацией вложенного класса, конструктор которого инициализируется с некоторыми частными данными-членами этого класса.

Пример:

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 включающего класса, он может получить доступ только к общедоступному члену данных класса включения.....

Другие вопросы по тегам