2017-09-06 59 views
1

這是一堂課。如何在聲明時間初始化成員對象?

class Checker 
{ 
public: 
    Checker(); 
    ~Checker(); 

private: 
    MapFileParser m_MapParser; //MapFileParser::MapFileParser(const char* path) 

}; 

當它聲明另一個類時,是否有任何方法來初始化類成員對象? MapFileParser類只有一個具有類似MapFileParser::MapFileParser(const char* path)簽名的構造函數。但是,當它在類成員中時,我無法初始化。所以我總是初始化Checker類的構造函數MapFileParser成員。

+0

你知道翻譯過程中的路徑嗎?當我意識到它可能不適用時,我正在寫同樣的答案。 – StoryTeller

+0

你說「翻譯過程中」意味着在編譯時? – HelloWorld

+0

是的。翻譯是C++標準使用的。它是實現不可知的。 – StoryTeller

回答

1

可以使用:

  1. 在級成員初始化語法來初始化一個成員變量(僅在可能的C++ 11或更高版本)。

    MapFileParser m_MapParser = MapFileParser("some sensible file name"); 
    
  2. 用於初始化成員變量的初始化程序列表語法。

    Checker::Checker() : m_MapParser("some sensible file name") { ... } 
    

中類成員初始化語法是有幫助的前提是你有一個以上的構造函數。如果您有一個構造函數,則可以使用初始化程序列表語法而不會丟失功能。

如果您有多個構造函數並且您可以使用C++ 11或更高版本的編譯器,那麼您可以使用委託構造函數來減少代碼重複。


在評論,你說:

我會解決的檢查器()的參數無效爲const char *和檢查(爲const char *路徑)將通過路徑MapFileParser 。

在這種情況下,唯一的解決方案是使用成員初始化列表來初始化成員。

Checker::Checker(char const* path) : m_MapParser(path) { ... } 
2

從C++ 11開始,您可以使用default member initializer,例如,

class Checker 
{ 
    ... 
    MapFileParser m_MapParser{"something"}; 
    // or 
    MapFileParser m_MapParser = MapFileParser("something"); 
}; 

C++ 11之前,你必須使用member initializer list

成員初始化列表在這裏可以指定這些對象的非默認初始化的地方。

例如,

class Checker 
{ 
public: 
    Checker() : m_MapParser("something") {} 
    ... 
private: 
    MapFileParser m_MapParser; 
}; 
+0

謝謝,但在11之前呢? – HelloWorld

+0

@HelloWorld - 你運氣不好 – StoryTeller

+0

@HelloWorld回覆修改。 – songyuanyao