2011-03-17 87 views
2

好吧,所以我一直在做一個家庭作業項目,並找到一種方法讓我完成作業並將其打開,但仍然困擾着我。如何在C++中的類定義之外重載一個構造函數

我有一個動態分配一些其他類和派生類的基類。


//header 
class Base 
{ 
Private: 
    Type *type_ptr; 
Public: 
    Base(); 
    Base(Type &new_type); 
    //getters and setters 
} 

class Derived : public Base 
{ 
Private: 
    Type2 *type2_ptr; 
Public: 
Derived(); 
Derived(Type, Type2) : Base(Type); 

} 

我想搞清楚的是這應該是什麼樣子,我.cpp文件,而不是在網上像這樣做,

Derived(Type new_type, Type2 new_type2): Base(new_type){ 
    type2_ptr = new Type2(new_type2); 
}; 

編輯:如果我嘗試類似的以上我的.cpp,我得到象這樣的錯誤,總是他們兩個太...

undefined reference to `vtable for Derived' 
undefined reference to `vtable for Derived' 
+0

可能的重複[這是什麼原因的C++模板代碼的錯誤?](http://stackoverflow.com/questions/5288696/whats-the-cause-of-the-error-with-this-c - 模板代碼) – Nawaz 2011-03-17 06:14:45

+0

好像我正在看一個完全不同的錯誤,它編譯得很好,但不會鏈接。 – TicViking 2011-03-17 06:25:03

+0

如果沒有可編譯的代碼,很難診斷出這些錯誤。你可以發佈一個*最小*但完整的代碼樣本,重現錯誤? – 2011-03-17 08:30:38

回答

1

類以外,你需要使用Derived::所有構造函數和函數!

Derived::Derived(Type new_type, Type2 new_type2): Base(new_type) 
{//^^^^^^^^^ note this 
    type2_ptr = new Type2(new_type2); 
}; 

也考慮使用initialization-list儘可能多。這裏是一個例子!

Derived::Derived(Type new_type, Type2 new_type2): Base(new_type), type2_ptr(new Type2(new_type2)) 
                   //^^^^ note this! 
{ 

}; 
+0

我仍然得到這兩個解決方案的vtable錯誤... – TicViking 2011-03-17 06:18:40

2

頭:

CPP:

Base::Base(): type_ptr(NULL) 
{ 
// implementation goes here 
} 
Base::Base(Type &new_type): type_ptr(&new_type) 
{ 
// implementation goes here 
} 


Derived::Derived() 
{ 
// implementation goes here 
} 

Derived::Derived(Type& new_type, Type2 new_type2): Base(new_type), 
    type2_ptr(new Type2(new_type2)) 
{ 
// implementation goes here 
} 

注泰德new_type爲基準,在不Derived局部變量,所以傳遞給導出變量必須在適當的範圍內!

0

你沒有顯示任何東西。在還有你的代碼中,有 應該沒有虛函數表,因爲沒有虛函數(和 類不是多態的,無論繼承的。

假設有虛函數,你應該差不多了。 肯定是一個虛析構函數添加到庫

除此之外,在.cpp文件的定義應該是:

Derived::Derived(Type new_type, Type2 new_type2) 
    : Base(new_type) 
    , type2_ptr(new Type2(new_type2)) 
{ 
} 

添加派生::在你前面定義的,並且有 沒有在你揭示哪些守則的代碼ld會導致問題。你 真的應該提供一個完整的代碼例子,它會造成問題;否則,我們可以猜測。