【问题标题】:Nested class' access to enclosing class' private data members嵌套类对封闭类私有数据成员的访问
【发布时间】:2009-10-22 03:20:58
【问题描述】:

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

例子:

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 错误。在嵌套类访问其封闭类的成员时,我有什么遗漏吗?

【问题讨论】:

    标签: c++ nested


    【解决方案1】:

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

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

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

    额外说明:在原来的C++98中,内部类没有访问外部类的特殊权限。使用 C++98 编译器,您要么必须赋予内部类必要的特权(友谊),要么将成员 xy 公开。然而,这种情况在 C++98 中被归类为defect,并决定内部类应该可以完全访问外部类成员(甚至是私有成员)。因此,您是否需要在访问权限方面做任何额外的事情取决于您的编译器。

    【讨论】:

    • 谢谢。我在自己研究时读到了 C++98 中的缺陷,但不知道该怎么做。感谢您清理一切。
    【解决方案2】:

    您的代码的问题是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) 
        { }
      };
    };
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-14
        • 2015-07-16
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        • 2010-12-12
        • 2023-03-29
        • 2015-03-06
        相关资源
        最近更新 更多