2015-06-06 67 views
0

我試圖做兩個可以自己調用的小構造函數,然後創建一個更大的構造函數,它允許您通過簡單地調用其他兩個構造函數一次完成所有任務。我的代碼多重構造函數的繼承

例子:

Foo::Foo(bool someVar, int someOtherVar, int fooBar) : Foo(someOtherVar, fooBar), Foo(someVar) {} 

Foo::Foo(bool someVar) { this->_someVar = someVar; } 

Foo::Foo(int someOtherVar, int fooBar) { this->_someOtherVar = someOtherVar + fooBar; } 

從中我得到

In constructor 'Foo::Foo(bool, int, int)': error: mem-initializer for 'class Foo::Foo' follows constructor delegation Foo(someOtherVar, fooBar), Foo(someVar) { } 

問題是什麼?

+0

目標構造函數必須是* ctor-initializer *中唯一的* mem初始化符*,否則* ctor-initializer *是格式不正確的。 – 0x499602D2

+0

不允許使用多個構造函數。訪問這個網站了解更多關於這個https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_delegating_constructors?lang=en – Nivetha

回答

3

如果委託給構造函數,那麼這是您在初始化程序列表中唯一可以執行的操作。從[class.base.init]/6:

MEM-初始化列表可以使用任何類或-decltype ,它表示的構造的類本身委託給構造的類的另一個構造。如果mem-initializer-id指定構造函數的類,它應該是唯一的元初始化程序;

因此,這是非法的:

Foo::Foo(bool someVar, int someOtherVar, int fooBar) 
    : Foo(someOtherVar, fooBar) 
    , Foo(someVar) //<== second mem-initializer is not allowed 
{} 
+0

該死的,這很糟糕。 – user1763295

1

不能調用同一類的兩個contructors的方式。寫一個完成所有初始化的構造函數,然後寫兩個構造函數來調用它,並傳遞一些參數和一些默認值。