嵌套类的访问封闭类的私有数据成员(Nested class' access to enclo

2019-08-31 08:23发布

我在实施一个嵌套类是谁的构造与某些封闭类的私有数据成员的初始化麻烦。

例:

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错误。 是否有什么我失踪,当涉及到嵌套类访问它的外围类的成员?

Answer 1:

构件xy是非静态数据成员Enclosing ,这意味着它们仅是具体的对象中存在Enclosing类。 如果没有一个具体的对象,无论x也不y存在。 同时,您要指xy没有对象。 这不能做,这是编译器是想告诉你。

如果你想初始化成员Inner::fooInner::barxy ,你必须通过一个具体的对象Enclosing型到Inner的构造函数。 例如

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

额外注意:在原来的C ++ 98内类没有特殊的权限正在访问外部类。 随着C ++编译器98你要么必须给内部类的必要的权限(友谊)或暴露成员xy公众。 不过,这种情况被列为缺陷在C ++ 98和它决定内部类应该具有完全访问外类成员(甚至私人的)。 所以,无论你做任何事情额外的关于访问权限取决于你的编译器。



Answer 2:

与您的代码的问题是不可见性 ,正如指出的AndreyT ,但该实例Inner类是未绑定到的具体实例Enclosing类。 的换言之构建时Inner编译器无法知道的方式哪个对象采取xy从值。

你必须明确提供的一个实例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) 
    { }
  };
};


Answer 3:

嵌套类无法访问封闭class.compiler显示错误,如果我们试图访问包含类的女贞成员的女贞数据成员,它只能访问封闭类的公共数据成员.....



文章来源: Nested class' access to enclosing class' private data members
标签: c++ nested