2017-04-05 68 views
1

我有一個結構C++在類構造上做了一個類構造成員?

struct MyStruct { 
    MyStruct(XML cfg) { ... } 
    int m_1, m_2, ... ; 
} 

和A類

class MyBaseClass { 
    public: 
    MyBaseClass() {}  
    MyStruct m_struct; 
} 

class MyClass : public MyBaseClass { 
    public: 
    MyClass(XML cfg) { m_struct = MyStruct(cfg); }   
} 

現在的編譯器抱怨MYSTRUCT沒有一個空的構造

error: no matching function for call to ‘MyStruct::MyStruct()’ 
MyClass(XML cfg) { m_struct = MyStruct(cfg); } 

我不認爲德繼承戲劇一個角色ehre,但我保持它的完整性,因爲它可能是這樣。我從來沒有顯式調用MyStruct的空構造函數。類MyClass是否這樣做是因爲m_struct是它的成員?
如果是這種情況,有沒有辦法沒有它初始化成員或只有指針作爲成員纔有可能?

我知道我可以只需添加一個空的構造我的結構或改變構造函數

MyClass(XML cfg) : m_struct = MyStruct(cfg) {} 

解決這個問題,但我很好奇,想知道究竟是怎麼回事。

+0

'struct'和'class'是一樣的。它們在這裏不構成有用的類別。 – juanchopanza

+0

我使用一個結構體,因爲它只包含幾個公共成員。這個類本身包含了比我的例子更多的東西,我只是試圖在我的示例中成爲minimalsitic – chrise

+0

繼承在這裏確實沒有任何作用。你可以完全刪除MyClass,實例化MyBaseClass,並有完全相同的問題。 – WhozCraig

回答

1

在類構造上做類構造成員嗎?

當然是的。這個問題發生在MyBaseClass的構造函數中,它不會顯式地初始化成員m_struct,那麼它將被默認初始化,但MyStruct沒有默認構造函數。

這不僅適用於數據成員,也適用於基類對象。對於MyClass的構造函數,它沒有明確指定基類的構造函數,則會調用MyBaseClass的默認構造函數,然後如上所述引發錯誤。

您可以添加一個默認的構造函數爲MyStruct,或使用member intializer listMyBaseClass構造函數,調用MyStruct::MyStruct(XML cfg)明確並初始化成員m_struct。例如

MyBaseClass() : m_struct(some_thing) {} 
+0

謝謝,我沒有意識到這一點。我碰巧使用智能指針作爲實例本身的成員,所以在我用C++修補的幾周內,我從未偶然發現過這個問題 – chrise

+0

@chrise智能指針可以默認構造;所以一切都很好。 – songyuanyao

1

如果您省略成員初始值設定項,編譯器將插入一個不使用參數。因此錯誤。

這也意味着,如果編譯器允許,那麼在您初始化構造函數體內的成員的第一個提取中,成員會初始化兩次。不要這樣寫代碼。