invalid use of non-static data member

匿名 (未验证) 提交于 2019-12-03 03:04:01

问题:

For a code like this:

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

I get this error:

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

currently the variable a is initialized in the constructor of foo.

if I make it static, then it says:

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

However I want to pass a value to a in the constructor. What is the solution then?

回答1:

In C++, unlike (say) Java, an instance of a nested class doesn't intrinsically belong to any instance of the enclosing class. So bar::getA doesn't have any specific instance of foo whose a it can be returning. I'm guessing that what you want is something like:

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

But even for this you may have to make some changes, because in versions of C++ before C++11, unlike (again, say) Java, a nested class has no special access to its enclosing class, so it can't see the protected member a. This will depend on your compiler version. (Hat-tip to Ken Wayne VanderLinde for pointing out that C++11 has changed this.)



回答2:

In C++, nested classes are not connected to any instance of the outer class. If you want bar to access non-static members of foo, then bar needs to have access to an instance of foo. Maybe something like:

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

Or maybe

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

In any case, you need to explicitly make sure you have access to an instance of foo.



回答3:

The nested class doesn't know about the outer class, and protected doesn't help. You'll have to pass some actual reference to objects of the nested class type. You could store a foo*, but perhaps a reference to the integer is enough:

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) { } }; 

Now you can instantiate inner classes like Inner i(n); and call i.get().



回答4:

You try to access private member of one class from another. The fact that bar-class is declared within foo-class means that bar in visible only inside foo class, but that is still other class.

And what is p->param?

Actually, it isn't clear what do you want to do



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!