我有如下代碼:如何聲明一個包含對外部類的引用的成員變量?
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