2016-11-20 17 views
1

次のコードを考えてみましょう:初期化オブジェクトのデータメンバC++

class Game { 
private: 
    vector<SomeType*> vec; 
    OtherType obj; 

public: 
    Game(char* configuration_file); 
}; 

どのようにしてVECとOBJの両方がCONFIGURATION_FILEコンテンツに依存していることを考慮ゲームのコンストラクタを実装する必要がありますか?

vecとobjを構築する前に、configuration_fileを解析する必要があるため、初期化リストを使用することはできません。

コンストラクタのボディ内部でvecとobjをconstrcutする場合、両方のデフォルトコンストラクタが呼び出されるよりも、これを防ぐ方法がありますか?

このようなことを行う通常の方法は何ですか?

ありがとうございました。

+0

なぜそれを直接コピーしないのですか?obj = OtherType(parsedData);コンストラクタの本体にあります。デフォルトのコンストラクタをprivateにすると、本体に入る前にすべてのゲームデータメンバーを初期化しなければならないので、objのデフォルトのコンストラクタを呼び出すことになるので、 –

+0

はコンパイルされません。 –

+0

はい、ボディコンストラクタに入る前に、オブジェクトのすべてのデフォルトコンストラクタが呼び出されます。 john zwickの解決策は良いです –

答えて

1

ベクターをデフォルトで構築することは確かに無害なので、デフォルトで構築するOtherTypeは不可能であると仮定しましょう。それでは、私はこのように扱います:

+0

@Captain_Tiras:それは一つの方法であるか、単に 'load()'を実装することができます。 –

+0

これを静的関数として実装します。 –

0

時には、どこに行くのかを得るためには、少し迂回する必要があります。これは、この種のデータに設定ファイルを解析し、プライベート静的機能だろう

std::pair<std::vector<SomeType *>, OtherType> Game::parse_config_file(char *configuration_file) 
{ 
    // ... 
} 

まず、静的なプライベート関数を記述します。

さて、あなたは一緒にこのジグソーパズルを置くことができます。

class Game_config { 

protected: 

    vector<SomeType*> vec; 
    OtherType obj; 

    Game_config(const std::pair<std::vector<SomeType *>, OtherType> &); 
}; 

class Game : private Game_config { 

    static std::pair<std::vector<SomeType *>, OtherType> Game::parse_config_file(char *configuration_file); 

public: 
    Game(char* configuration_file) : Game_config(parse_config_file()) 
    { 
    } 
}; 

Game_configのコンストラクタは明白です。

上記のわずかなバリエーションは、Game_configスーパークラスを返し、Gameのコンストラクタでそのスーパークラスをコピー構成することがあります。最新のコンパイラは、RVOをこのユースケースで使用できるはずです。

関連する問題