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

时间:2009-10-22 03:20:59

标签: 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
    //...
};

我收到invalid use of non-static data member错误。当涉及对其封闭类'成员的嵌套类访问时,我是否缺少某些内容?

3 个答案:

答案 0 :(得分:20)

成员xyEnclosing的非静态数据成员,这意味着它们只存在于Enclosing类的具体对象中。没有具体对象,xy都不存在。同时,您尝试在没有对象的情况下引用xy。这是无法完成的,这是编译器试图告诉你的。

如果要从Inner::fooInner::bar初始化成员xy,则必须将Enclosing类型的具体对象传递到{ {1}}构造函数。例如

Inner

额外注意:在原始的C ++ 98中,内部类没有访问外部类的特殊权限。使用C ++ 98编译器,您必须为内部类提供必要的权限(友谊)或将成员class Enclosing::Inner { explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y) {} //... }; x公开。但是,这种情况在C ++ 98中被归类为defect,并且决定内部类应该具有对外部类成员(甚至是私有成员)的完全访问权限。因此,您是否必须对访问权限做任何额外的操作取决于您的编译器。

答案 1 :(得分:9)

not visibility指出代码的问题是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) 
    { }
  };
};

答案 2 :(得分:0)

嵌套类无法访问封装类的privet数据成员。如果我们尝试访问封闭类的privet成员,则显示错误,它只能访问封闭类的公共数据成员.....