2016-11-20 159 views
1

考慮下面的代碼:初始化對象數據成員C++

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

public: 
    Game(char* configuration_file); 
}; 

一個應該如何實現遊戲構造考慮這兩個VEC與obj依賴CONFIGURATION_FILE內容?

初始化列表不可用,因爲在構建vec和obj之前必須先解析配置文件。

如果我會在構造函數的內部構造vec和obj,那麼兩個構造函數的默認構造函數都會被調用,有沒有辦法來防止這種情況?

做這種事情的正常方法是什麼?

謝謝。

+0

爲什麼不直接複製構造obj = OtherType(parsedData);在構造函數體中。如果你使默認的構造函數是私有的,它不會編譯 –

+0

從我的理解,這將導致對obj默認構造函數的調用,因爲所有遊戲數據成員必須在進入正文前初始化,我想保存該調用。 –

+0

是的,在進入body構造函數之前,所有對象的默認構造函數都會被調用。 john zwick解決方案很好 –

回答

1

默認構建向量無疑是無害的,所以我們假設默認構造OtherType是不可能的。然後,我會這樣處理:

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

    static OtherType load(const char* config_file); 

public: 
    Game(const char* config_file) 
    : obj(load(config_file)) 
    { 
    // populate vec here 
    } 
}; 
+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的構造應該是顯而易見的。

上面的一個小小的變化是讓parse_config_file()返回Game_config超類,並且有Game的構造函數copy-construct構造它的超類。在這個用例中,現代編譯器應該能夠使用RVO。