C++クラスFooと、Fooポインターが渡されるコンストラクターで作成する必要のあるクラスBarがあり、このポインターはBarインスタンスのライフサイクルで不変のままになることを想定しているとします。それを行う正しい方法は何ですか?
実際、以下のコードのように書くことができると思いましたが、コンパイルされません。
class Foo;
class Bar {
public:
Foo * const foo;
Bar(Foo* foo) {
this->foo = foo;
}
};
class Foo {
public:
int a;
};
どんな提案も歓迎します。
初期化リストでそれを行う必要があります:
Bar(Foo* _foo) : foo(_foo) {
}
(混乱を避けるために、着信変数の名前を変更したことに注意してください。)
イニシャライザでそれをしなければならないと思います。例えば:
Bar(Foo* foo) : foo(foo) {
}
補足として、fooが指すものを決して変更しない場合は、参照として渡します。
Foo& foo;
Bar(Foo& foo) : foo(foo) {
}
Constメンバーおよびその他の特殊なケース(親クラスなど)の初期化は、初期化リストで実行できます。
class Foo {
private:
const int data;
public:
Foo(int x) : data(x) {}
};
または、同様に、親の初期化用
class Foo {
private:
int data;
public:
Foo(int x) : data(x) {}
};
class Bar : Foo {
public:
Bar(int x) : Foo(x) {}
};
初期化子リストでfooを初期化する必要があります。
class Bar {
Foo* const foo;
public:
Bar(Foo* f) : foo(f) {...}
};
参照を使用します。
Foo& foo;
Bar(Foo& f) : foo(f) { }
その後、foo
でBar
を簡単に参照できます。
foo.doSomething();
試してください:Bar(Foo* xfoo) : foo(xfoo) {}