可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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