无效使用非静态数据成员

mah*_*ood 34 c++

对于像这样的代码:

class foo {
  protected:
    int a;
  public:
    class bar {
      public:
        int getA() {return a;}   // ERROR
    };
    foo()
      : a (p->param)
};
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

 invalid use of non-static data member 'foo::a'
Run Code Online (Sandbox Code Playgroud)

目前该变量a在构造函数中初始化foo.

如果我让它静止,那么它说:

 error: 'int foo::a' is a static data member; it can only be initialized at its definition
Run Code Online (Sandbox Code Playgroud)

但是我想a在构造函数中传递一个值.那么解决方案是什么?

rua*_*akh 31

在C++中,与(比如)Java不同,嵌套类的实例本质上不属于封闭类的任何实例.因此,bar::getA没有任何具体的实例foo,其a可以返回.我猜你想要的是:

    class bar {
      private:
        foo * const owner;
      public:
        bar(foo & owner) : owner(&owner) { }
        int getA() {return owner->a;}
    };
Run Code Online (Sandbox Code Playgroud)

但即便如此,您可能还需要进行一些更改,因为在C++ 11之前的C++版本中,与(再说)Java不同,嵌套类对其封闭类没有特殊访问权限,因此无法看到protected成员a.这取决于您的编译器版本.(向Ken Wayne VanderLinde提示,指出C++ 11改变了这一点.)

  • 您可能应该注意到C++ 11中的访问权限已更改.现在标准中写道:"嵌套类是一个成员,因此具有与任何其他成员相同的访问权限". (2认同)

Ken*_*nde 6

在C ++中,嵌套类未连接到外部类的任何实例。如果您要bar访问的非静态成员foo,则bar需要访问的实例foo。也许像:

class bar {
  public:
    int getA(foo & f ) {return foo.a;}
};
Run Code Online (Sandbox Code Playgroud)

或许

class bar {
  private:
    foo & f;

  public:
    bar(foo & g)
    : f(g)
    {
    }

    int getA() { return f.a; }
};
Run Code Online (Sandbox Code Playgroud)

无论如何,您都需要明确确保可以访问的实例foo