2010-12-05 6 views
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のコンストラクタが(それはpublicメンバーです)取り込むものを変更することはできませんので、何をすべきか分かりません。何か案は?

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

答えて

5

あなたの代わりに、ポインタのインスタンスオブジェクトが必要な場合は、試してみてください。Charizard試みはそのコンストラクタ内tMyTrainer上の任意のメソッドを呼び出す場合は、あなたの新しいtrainerオブジェクトがまだ完全に構築されていないため

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

は、注意してください当時。

+0

これはまさに私が探していたものであり、警告をいただきありがとうございます。 – Coltin

4

thisの代わりに*thisを使用してください。

myPokemonは、trainerが実行される前に構築されるので、未構築のtrainerへの参照を取得します。定義されていない動作につながるので、メソッドを呼び出さないように注意してください(またはそのデータを使用してください)。

関連する問題