2016-03-06 31 views
-2

我想知道如果以下是在多重繼承的情況下設置基類的範式方法。這種方法有沒有陷阱?設定基類與多重約束的範式方法

#include <iostream> 
struct A 
{ 
    int one, two; 
}; 
struct B 
{ 
    int three, four; 
}; 
struct C : A, B 
{ 
    C(int One, int Two, int Three, int Four) : A({ One, Two }),B({ Three, Four }){} 
}; 

int main(int argc, char *argv[]) 
{ 
    C myC(1, 2, 3, 4); 
    //a lot of code here 
    B myB={ 9, 10 }; 
    static_cast<B&>(myC)= myB;//Code smell? 
    std::cout << myC.three <<","<<myC.four<< std::endl; 
    return 0; 
} 
+0

類層次結構(單個或多個繼承)和賦值很少一起工作。你有真正的用例嗎? –

+0

當然,我有一個包含程序設置的大型結構。有時,GUI界面用於配置此設置信息的一部分。在這種情況下'static_cast (channel_settings)= getRenderSettings()''。在一個普通的世界裏,這些設置將存在於GUI中,但我試圖在兩個組件之間進行強烈的分離以進行測試。 – Mikhail

+0

比繼承更喜歡構圖。 –

回答

1

,這大概比static_cast更安全:

template<class T, class U> 
T implicit_cast(U&& u){return std::forward<U>(u);} 

,因爲它不能做的比隱式轉換其他任何東西。

implicit_cast<B&>(myC)= myB 
0

一般來說,你甚至想這樣做,這是一個代碼味道的事實,因爲賦值運算符和類層次結構往往不拌勻。

但是,一種方法是提供適當的賦值運算符類C。一個接受const A &類型的參數,另一個接受const B &。然後

myC = some_a; 
myC = some_b; 

將工作,而不需要用隱式或顯式轉換。

如果您在實現這樣一個賦值操作符時遇到困難,那麼這通常表明設計有更多錯誤。對於這種格式,這種困難可能提出的問題清單太長了。請記住,實際上,如果需要賦值運算符,那麼相應的構造函數和(可能)移動構造函數也是如此。