2011-06-07 46 views
0

我有這樣的:子類和使用的基類初始化器

class foo { 
public: 
    int a; 
    int b; 
    int c; 
}; 

這很好,但我想添加一些運算符重載,而無需修改類Foo:

class bar: public foo { 
    operator==(const bar &x) const { 
    return a == x.a; 
    } 
} 

精細,到目前爲止,但現在我需要用我從另一個類獲得的對象數組來初始化條。沒問題,我可以複製所有foo的變量到在一個專用的構造吧:

bar::bar(foo &x) { 
    a = foo.a; 
    /* etc */ 
} 

但這似乎亂了,如果類Foo在被更新,那我也太更新吧。受歡迎得多,如果巴可自動初始化本身(它永遠不會包含它自己的數據成員)

回答

1

嘛,很簡單:

bar::bar(const foo& x) 
    : foo(x) 
{ 
} 

只要使用foo的拷貝構造函數。 :{之間的所有內容都稱爲初始化程序列表。你可以直接在那裏初始化你的成員和基類。對於foo,拷貝構造函數可能看起來像下面這樣:

foo::foo(const foo& other) 
    : a(other.a) 
    , b(other.b) 
    , c(other.c) 
{ 
} 

請注意,我用const引用,這是一個很好的做法,因爲你不觸及其他對象需要兩個參數。另外請注意,只有當您的類包含原始指針(例如int*)時,大多數情況下自己編寫foo的拷貝構造函數並不是必需的。如果你沒有定義一個拷貝,只編譯所有數據成員的淺拷貝,編譯器會自己生成一個拷貝拷貝。

2

是不是爲確保美孚擁有一個拷貝構造函數簡單.......

bar::bar(foo &x) 
: foo(x) 
{ 
} 

class foo { 
foo::foo(foo &x) 
{ 
    a = foo.a; /* etc */ 
} 

}; 
+0

'foo',如問題中給出的,已經有一個默認的拷貝構造函數。你不需要添加任何東西,只需調用它。 – 2011-06-07 08:37:58

+0

我再次閱讀它,我沒有看到它說Foo有一個拷貝構造函數。 在他的例子中,我印象中他打印了Foo的所有相關類定義。 – NotJarvis 2011-06-07 08:44:10

+0

如果這個類看起來像這個問題,編譯器會爲它生成一個默認的拷貝構造函數,做所有元素的成員拷貝。 – 2011-06-07 08:46:19

0

繼承構造函數不能在C++ 03來完成,但是可以近似。添加這些構造函數:

template<class T1> bar(const T1& x1) : foo(x1) {} 
template<class T1, class T2> bar(const T1& x1, const T2& x2) : foo(x1, x2) {} 
template<class T1, class T2, class T3> bar(const T1& x1, const T2& x2, const T3& x3) : foo(x1, x2, x3) {} 
// as much as you need... 

在C++ 0x中使用單個可變模板構造函數和完美轉發。

+1

* Huh *?如果你只是想讓派生類可以從基類中初始化,那肯定可以在C++ 03中使用。 – Xeo 2011-06-07 08:43:54

+0

@Xeo:複製初始化 - 可能。繼承構造函數 - 不可能。只要嘗試用一種新方法來擴展'vector',看看問題是什麼...... – ybungalobill 2011-06-07 08:45:25

+0

無論如何,顯然這不是OP想要的...(儘管它也解決了他/她的問題)。 – ybungalobill 2011-06-07 08:46:10