对于这样的代码:
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'
目前变量a
在foo
。
如果我让它静止,那么它说:
error: 'int foo::a' is a static data member; it can only be initialized at its definition
但是我想在构造函数中将值传递给a
。
那么解决方案是什么?
答案 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?
实际上,目前尚不清楚你想做什么