我有如下代码:如何声明一个包含对外部类的引用的成员变量?
class outer {
public:
class inner {
outer & o;
public:
inner(outer & o): o(o) {}
};
inner i(*this);
};
但是这给了我错误说:
error: expect specifier before token '*'
我怎样才能做到这一点?我必须使用指针吗?
我有如下代码:如何声明一个包含对外部类的引用的成员变量?
class outer {
public:
class inner {
outer & o;
public:
inner(outer & o): o(o) {}
};
inner i(*this);
};
但是这给了我错误说:
error: expect specifier before token '*'
我怎样才能做到这一点?我必须使用指针吗?
1)在outer
的构造函数初始化列表中初始化i
。
inner i;
outer(): i(*this) {}
2)(C++ 11只)用大括号初始化为i
。在这种情况下,你的有使用大括号,而不是括号。
inner i{*this};
成员i
可以在类中声明,但如果您使用的是支持C++只有98编译器不能被初始化。您可以在outer
的构造函数的实现中初始化它。
class outer {
public:
class inner {
outer & o;
public:
inner(outer & o): o(o) {}
};
outer() : i(*this) {}
inner i;
};
你不能这样做。你可以做到这一点在外部类
outer() : i(*this) {}
这是这样的构造是容易出错的,虽然,因为实例尚未建造和this
是不完整的。一般不使用this
在初始化列表(GCC会给你一个警告)
另一种方式是仅适用于C++ 11
inner i { *this };
有两种方法之间没有实质性的区别。非静态成员按声明顺序初始化。如果有一个ctor-initializer,那么它就被使用了,否则如果有一个使用了brace-initializer的话,否则它会被默认初始化,并且它会进入下一个成员。 – Brian
无论如何,'* this'是一个左值,并且如果存在左值到右值的转换,则只有一个问题。在这种情况下不会有,因为该参数是一个参考。 – Brian