Вложенный класс 'доступ к закрытому классу' члены личных данных - PullRequest
9 голосов
/ 22 октября 2009

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

Пример:

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 ]

20 голосов
/ 22 октября 2009

Элемент x и y являются нестатическими членами данных Enclosing, что означает, что они существуют только в конкретном объекте класса Enclosing. Без конкретного объекта не существует ни x, ни y. Тем временем вы пытаетесь сослаться на x и y без объекта. Это не может быть сделано, о чем вам и говорит компилятор.

Если вы хотите инициализировать элементы Inner::foo и Inner::bar из x и y, вам нужно передать конкретный объект типа Enclosing в конструктор Inner s. Например

class Enclosing::Inner {    
  explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y) 
    {}
  //...
};

Дополнительное примечание: в исходном C ++ 98 внутренний класс не имеет особых привилегий доступа к внешнему классу. С компилятором C ++ 98 вы должны либо дать внутреннему классу необходимые привилегии (дружба), либо выставить члены x и y как общедоступные. Однако эта ситуация была классифицирована как дефект в C ++ 98, и было решено, что внутренние классы должны иметь полный доступ к внешним членам класса (даже частным). Итак, нужно ли вам что-то делать с правами доступа, зависит от вашего компилятора.

9 голосов
/ 22 октября 2009

Проблема с вашим кодом - , а не видимость , на что указывает 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) 
    { }
  };
};
0 голосов
/ 18 апреля 2010

вложенный класс не может получить доступ к частному элементу данных включающего class.compiler, если при попытке получить доступ к частному элементу вложенного класса, он может получить доступ только к общедоступному члену данных включающего класса .....

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