web-dev-qa-db-ja.com

コンストラクタでconstフィールドを初期化する方法は?

C++クラスFooと、Fooポインターが渡されるコンストラクターで作成する必要のあるクラスBarがあり、このポインターはBarインスタンスのライフサイクルで不変のままになることを想定しているとします。それを行う正しい方法は何ですか?

実際、以下のコードのように書くことができると思いましたが、コンパイルされません。

class Foo;

class Bar {
public:
    Foo * const foo;
    Bar(Foo* foo) {
        this->foo = foo;
    }
};

class Foo {
public:
  int a;
};

どんな提案も歓迎します。

65
puccio

初期化リストでそれを行う必要があります:

Bar(Foo* _foo) : foo(_foo) {
}

(混乱を避けるために、着信変数の名前を変更したことに注意してください。)

77
Jim Buck

イニシャライザでそれをしなければならないと思います。例えば:

Bar(Foo* foo) : foo(foo) {
}

補足として、fooが指すものを決して変更しない場合は、参照として渡します。

Foo& foo;

Bar(Foo& foo) : foo(foo) {
}
18
SingleShot

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) {}
};
14
ezpz

初期化子リストでfooを初期化する必要があります。

class Bar {
    Foo* const foo;
  public:
    Bar(Foo* f) : foo(f) {...}
};
6
KeithB

参照を使用します。

Foo& foo;
Bar(Foo& f) : foo(f) { }

その後、fooBarを簡単に参照できます。

foo.doSomething();
2
AraK

試してください:Bar(Foo* xfoo) : foo(xfoo) {}

0
John Ledbetter