2011-12-06 56 views
3

我知道這是經常被問到的問題,但我想不出我的代碼工作的方式,所以我會很高興得到一些help.Here的代碼:C++錯誤:沒有適當的默認構造函數可用

#include "stdafx.h" 
#include "iostream" 
#include "string" 
#include "cmath" 
#include "ctime" 
using namespace std; 
class quad{ 
    int Lice; 
public: 
    quad(int x, int z){ 
     Lice = x*z; 
    } 
    int ShowLice(){ 
     return Lice; 
    } 
}; 
class tri : public quad{ 
    int Lice; 
public: 
    tri(int a, int b, int c){ 
     Lice = a*b*c; 
    } 

}; 
int main(){ 
quad ob1(2,2); 
tri ob2(2,2,2); 
cout<<ob1.ShowLice(); 
cout<<ob2.ShowLice(); 

return 0; 
} 

我使用VS2008和編譯器錯誤是:

project1.cpp(20) : error C2512: 'quad' : no appropriate default constructor available 

謝謝,Leron。

回答

3

它更改爲

class quad{ 
protected: 
    int Lice; 
public: 
    quad(int x, int z){ 
     Lice = x*z; 
    } 
    int ShowLice(){ 
     return Lice; 
    } 
}; 
class tri : public quad{ 

public: 
    tri(int a, int b, int c) : quad(a,b) { 
     Lice *= c; 
    } 

}; 

否點在具有兩個衍生的和基類的一個蝨子構件。使其受到保護,以便派生子類和子類重用相同的字段。

如果你在基類中有一個非默認構造函數,你必須使用派生類構造函數中的正確參數調用基類構造函數,就像我上面顯示的那樣。

另外,如果您使用繼承,則在基類中提供virtual destructo r是個好主意。在您的示例代碼中,問題可能不明顯。

+0

謝謝,現在工作得很好。 – Leron

2

您需要從tri初始化列表中調用quad構造:

tri(int a, int b, int c) : quad(a,b) {... 
2

當你構建一個類類型三它上升的繼承樹並試圖創建一個四邊形。它不能,因爲quad沒有默認的構造函數。要修復這個錯誤,你可以顯式調用quad的構造函數或者提供一個將被調用的默認構造函數。

在C++中,當沒有給定構造函數時會自動生成默認構造函數,但只要定義了任何構造函數,就不會再自動生成默認構造函數。即使沒有定義默認構造函數,也會發生這種情況。

+0

是的,我是C++中的新手我想我會堅持上面所示的方式。但是感謝關於這個主題的額外信息! – Leron

0

你是tri構造函數正試圖調用quad中的默認構造函數。你沒有添加這段代碼,編譯器爲你確保基類正確初始化。

由於沒有默認的構造函數,因此即使只有一個構造函數,也必須顯式調用要使用的構造函數。你會做這樣的:

tri(int a, int b, int c) : quad(a,b){ 
     Lice = a*b*c; 
    } 

或者任何你想傳遞給quad相應的參數。

相關問題