77

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

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

class Foo;

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

class Foo {
public:
  int a;
};

どんな提案でも大歓迎です。

4

6 に答える 6

97

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

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

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

于 2009-09-14T20:24:13.670 に答える
23

私はあなたがイニシャライザーでそれをしなければならないと信じています。例えば:

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

ちなみに、fooが指すものを変更しない場合は、参照として渡してください。

Foo& foo;

Bar(Foo& foo) : foo(foo) {
}
于 2009-09-14T20:26:00.440 に答える
17

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) {}
};
于 2009-09-14T20:25:36.897 に答える
6

イニシャライザリストでfooを初期化する必要があります。

class Bar {
    Foo* const foo;
  public:
    Bar(Foo* f) : foo(f) {...}
};
于 2009-09-14T20:25:39.517 に答える
0

参照を使用します:

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

fooその後、次の場所で簡単に 参照できますBar

foo.doSomething();
于 2009-09-14T20:24:35.103 に答える
0

試す: Bar(Foo* xfoo) : foo(xfoo) {}

于 2009-09-14T20:25:22.653 に答える