2016-03-03 91 views
3

我目前工作的一個類層次結構,其中從AB繼承和使用的C++的功能,它允許直接通過鍵入繼承構造函數:有沒有辦法在繼承構造函數時訪問初始化列表?

using A::A; 

而複製現有的所有構造函數。有什麼方法可以初始化類B的類屬性,否則它將被初始化列表初始化?

的類層次結構如下所示,在不使用構造繼承和精細編譯:

class A 
{ 

public: 
    A (int a) 
    {} 
}; 

class B 
: 
public A 
{ 
    public: 
    B (int a) 
    : 
     A(a), 
     blubb(a) 
    {} 
    float blubb; 
}; 

使用構造繼承和Revolver_Ocelot建議的答案,代碼如下所示:

class A 
{ 
public: 
    A (int a) 
    {} 
}; 

class B 
: 
public A 
{ 
    public: 
    using A::A; 
    float blubb {a}; 
}; 

這樣做具有以下編譯時錯誤消息:

foo.cpp:21:22: error: ‘a’ was not declared in this scope 
    float blubb {a}; 
       ^
foo.cpp:21:23: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘float’ in initialization 
    float blubb {a}; 
       ^

回答

3

在C++ 11可以使用初始化類變量through brace or equals initializer將被用來當否則成員是默認初始化:

class B : public A 
{ 
    using A::A; 
    MyComplexType foo {ConstructorArgument1, ConstructorArgument2}; 
}; 

編輯:由於新的情況,我會添加新的信息。

如果你提到過,沒有其他選擇,但是如果你想訪問基類構造函數參數,可以創建你自己想要的簽名的構造函數。但是,這並不意味着你必須重複代碼。相反,你可以委託大部分工作到基類的構造函數,只保留B類的東西,在B類:

class B : public A 
{ 
    public: 
    using A::A; 
    B(int a) : A(a), blubb(a) 
    {} 
    float blubb; 
}; 

如果構造函數的參數是用來初始化類A中的一些成員和派生類可以訪問該成員,您可以使用該成員來初始化派生類成員:

class A 
{ 
    protected: 
    int y; 
    public: 
    A(int a) : y(a) 
    {} 
}; 

class B : public A 
{ 
    int z {y}; 
    public: 
    using A::A; 
}; 
+0

您的建議似乎不工作,看看編輯的問題。我添加了兩個示例和錯誤消息。 –

+0

@JensHöpken我已經更新了我的答案。 –

相關問題