嵌套类'访问封闭类'私有数据成员

tri*_*ker 12 c++ nested

我在实现一个嵌套类时遇到了麻烦,该类的构造函数是用一些封闭类的私有数据成员初始化的.

例:

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
    //...
};
Run Code Online (Sandbox Code Playgroud)

我收到一个invalid use of non-static data member错误.当涉及到其封闭类的成员的嵌套类访问时,是否有一些我缺少的东西?

AnT*_*AnT 22

成员x并且y是非静态数据成员Enclosing,这意味着它们只存在于Enclosing类的具体对象中.没有具体的对象,既不存在x也不y存在.同时,你试图引用xy不引用对象.这是无法完成的,这是编译器试图告诉你的.

如果您想初始化的成员Inner::fooInner::bar来自xy,你必须的具体对象传递Enclosing类型为Inner构造函数.例如

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

额外注意:在原始的C++ 98中,内部类没有特殊权限访问外部类.使用C++ 98编译器,您必须为内部类提供必要的权限(友谊)或公开成员xy公开.但是,这种情况在C++ 98中被归类为缺陷,并且决定内部类应该具有对外部类成员(甚至是私有成员)的完全访问权限.因此,您是否必须在访问权限方面做任何额外的事情取决于您的编译器.


cdi*_*ins 9

正如AndreyT所指出的,代码的问题不是可见性,而是类的实例没有绑定到类的具体实例.换句话说,在构造编译器时无法知道从哪个对象获取和值.InnerEnclosingInnerxy

您必须向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) 
    { }
  };
};
Run Code Online (Sandbox Code Playgroud)