3

問題を次のサンプルコードに減らしました。

class Charizard { //truck
    trainer &myTrainer;
  public:
    Charizard(trainer &tMyTrainer);
};

class trainer {
    Charizard myPokemon;
  public:
    trainer();
};

Charizard::Charizard(trainer &tMyTrainer) : myTrainer(tMyTrainer) {}

パブリックメンバーを変更または追加せずに、トレーナーのコンストラクターを作成するにはどうすればよいですか。初期化リストにmyPokemonが作成されると、「myTrainer」は作成中のトレーナーを指すようになります。

これが私が試したことです:

trainer::trainer() : myPokemon(this) {}

しかしもちろん、「これ」は正しいタイプではありません。Charizardコンストラクターが取り込むもの(パブリックメンバー)を変更できないため、どうすればよいかわかりません。何か案は?

注:タイトルには作業が必要な場合があります。

4

2 に答える 2

5

ポインターの代わりにインスタンス オブジェクトが必要な場合は、次を試してください。

trainer::trainer() : myPokemon(*this) {}

その時点で新しいオブジェクトはまだ完全に構築されていないため、コンストラクターでCharizardメソッドを呼び出そうとする場合は注意してください。tMyTrainertrainer

于 2010-12-05T00:39:44.837 に答える
4

参照型が必要です-の*this代わりに使用してthisください。

多くのコンパイラはとにかくこれについて警告します:myPokemon完了する前に構築されるtrainerので、構築されていないへの参照を取得しますtrainer。未定義の動作につながるため、メソッドを呼び出さない(またはデータを使用しない)ように注意してください。

于 2010-12-05T00:41:37.307 に答える