教育上の理由から、このコードをコンパイルしてみましょう。
class Bar {
public:
Bar(int bunchOfCrap, int thatNeedsToBeHere, double toMakeABar);
};
class Foo {
public:
Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder)
Bar *y; // <- This is a pointer, Bar is not instantiated (this is just a *safer* placeholder)
Bar z; // <- What is this???
};
int main() {
Foo foo;
}
出力:
c++ uuu.cpp -o uuu
uuu.cpp:10:7: error: implicit default constructor for 'Foo' must explicitly initialize the reference member 'x'
class Foo {
^
uuu.cpp:14:10: note: declared here
Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder)
^
uuu.cpp:10:7: error: implicit default constructor for 'Foo' must explicitly initialize the member 'z' which does not
have a default constructor
class Foo {
^
uuu.cpp:16:9: note: member is declared here
Bar z; // <- What is this???
^
uuu.cpp:2:7: note: 'Bar' declared here
class Bar {
^
uuu.cpp:21:9: note: implicit default constructor for 'Foo' first required here
Foo foo;
^
2 errors generated.
make: *** [uuu] Error 1
それが言うように、デフォルトのコンストラクターがないため、メンバー参照とメンバー変数の両方を初期化する必要があります。初期化する必要はなく、デフォルトで。になります。Bar &x
Bar z;
Bar
y
NULL
x
と間接y
的にオブジェクトを参照します。参照するものを変更することはできませんx
(したがって、がインスタンス化されるときに初期化する必要がFoo
あります)。参照するものを変更できますy
。z
内部に存在するBar
サイズのメモリのチャンクFoo
です。このようなメンバー変数を合法的に宣言するには、コンパイラーがその大きさを認識できるように、Bar
beforeの完全な定義を配置する必要があります。Foo
Bar