无效使用非静态数据成员

时间:2012-03-06 19:11:45

标签: c++

对于这样的代码:

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

我收到此错误:

 invalid use of non-static data member 'foo::a'

目前变量afoo

的构造函数中初始化

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

 error: 'int foo::a' is a static data member; it can only be initialized at its definition

但是我想在构造函数中将值传递给a。 那么解决方案是什么?

4 个答案:

答案 0 :(得分:28)

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

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

但即便如此,你可能不得不做一些改变,因为在C ++ 11之前的C ++版本中,与(再说)Java不同,嵌套类对它的封闭类没有特殊的访问权限,所以它可以'请参阅protected成员a。这取决于您的编译器版本。 (向Ken Wayne VanderLinde提示,指出C ++ 11改变了这一点。)

答案 1 :(得分:5)

在C ++中,嵌套类没有连接到外部类的任何实例。如果您希望bar访问foo的非静态成员,则bar需要有权访问foo的实例。也许是这样的:

class bar {
  public:
    int getA(foo & f ) {return foo.a;}
};

或者

class bar {
  private:
    foo & f;

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

    int getA() { return f.a; }
};

在任何情况下,您都需要明确确保您有权访问foo的实例。

答案 2 :(得分:2)

嵌套类不了解外部类,protected没有帮助。您必须将一些实际引用传递给嵌套类类型的对象。您可以存储foo*,但也许对整数的引用就足够了:

class Outer
{
    int n;

public:
    class Inner
    {
        int & a;
    public:
        Inner(int & b) : a(b) { }
        int & get() { return a; }
    };

    // ...  for example:

    Inner inn;
    Outer() : inn(n) { }
};

现在,您可以实例化Inner i(n);等内部类,并调用i.get()

答案 3 :(得分:0)

您尝试从另一个类访问一个类的私有成员。 bar-class在foo-class中声明的事实意味着bar只在foo类中可见,但那仍然是其他类。

什么是p-> param?

实际上,目前尚不清楚你想做什么