我在实施一个嵌套类是谁的构造与某些封闭类的私有数据成员的初始化麻烦。
例:
Header File:
class Enclosing {
//...Public members
//...Private members
int x, int y
class Inner; // Declaration for nested class
};
Impl. File:
// Stuff...
class Enclosing::Inner {
explicit Inner() : foo(x), bar(y) // foo and bar are data members of Inner
//...
};
我得到一个invalid use of non-static data member
错误。 是否有什么我失踪,当涉及到嵌套类访问它的外围类的成员?
构件x
和y
是非静态数据成员Enclosing
,这意味着它们仅是具体的对象中存在Enclosing
类。 如果没有一个具体的对象,无论x
也不y
存在。 同时,您要指x
和y
没有对象。 这不能做,这是编译器是想告诉你。
如果你想初始化成员Inner::foo
和Inner::bar
从x
和y
,你必须通过一个具体的对象Enclosing
型到Inner
的构造函数。 例如
class Enclosing::Inner {
explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y)
{}
//...
};
额外注意:在原来的C ++ 98内类没有特殊的权限正在访问外部类。 随着C ++编译器98你要么必须给内部类的必要的权限(友谊)或暴露成员x
和y
公众。 不过,这种情况被列为缺陷在C ++ 98和它决定内部类应该具有完全访问外类成员(甚至私人的)。 所以,无论你做任何事情额外的关于访问权限取决于你的编译器。
与您的代码的问题是不可见性 ,正如指出的AndreyT ,但该实例Inner
类是未绑定到的具体实例Enclosing
类。 的换言之构建时Inner
编译器无法知道的方式哪个对象采取x
和y
从值。
你必须明确提供的一个实例Enclosing
类的的构造函数Inner
类像这样:
class Enclosing
{
private:
int x;
int y;
class Inner
{
private:
int foo;
int bar;
public:
explicit Inner(const Enclosing& e)
: foo(e.x), bar(e.y)
{ }
};
};
嵌套类无法访问封闭class.compiler显示错误,如果我们试图访问包含类的女贞成员的女贞数据成员,它只能访问封闭类的公共数据成员.....