对于像这样的代码:
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 ++中,嵌套类未连接到外部类的任何实例。如果您要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。
| 归档时间: |
|
| 查看次数: |
94415 次 |
| 最近记录: |