2012-03-13 55 views
5

繼承人我的錯誤沒有匹配的功能...錯誤:調用

「在構造‘NumGame :: NumGame(INT &)’: 錯誤:調用「類別沒有匹配功能::類別( )'「

我看了一些類似的問題,但似乎找不到答案。我有一個基類類別和NumGame是從它繼承,但不會編譯。

class Category { 

public: 
    void virtual selection(int&); 
    Category(int&); 
    virtual ~Category(){}; 
private: 
    int myRandNum; 
}; 

Category::Category(int& a){ 
    myRandNum = a; 
} 

void Category::selection(int& a){ 
    cout << "I am NumGame version number... " << a << endl; 
    cout << "Now Im playing... " << myRandNum << endl; 
} 

class NumGame : public Category { 

public: 
    void selection(int&); 
    NumGame(int&); 
    ~NumGame(){}; 
private: 
    int myRandNum; 
}; 

NumGame::NumGame(int& b){ 
    myRandNum = b; 
} 

void NumGame::selection(int& b) { 

} 

回答

9

Category沒有一個默認的構造函數,所以你需要提供的參數:

NumGame::NumGame(int& b) : Category(b) 
{ 

} 

OR

您需要爲Category類提供了一個無參數constrcutor自己NumGameCategory基礎對象:

NumGame::NumGame(int& b) : 
    Category(b) 
{ 
    myRandNum = b; 
} 
+0

但是,我不只是騎着默認構造函數嗎?如果我沒有超過它,那麼會使用默認的構造函數,這就是爲什麼我在默認構造函數中有參數的原因。順便說一句,這兩個答案都導致我的代碼編譯,顯然有些東西不清楚:) – Aikiman001 2012-03-13 11:52:17

15

原因的錯誤:

當你創建派生類NumGame Base類Category無參數的構造函數被調用來創建對象的Category部分的一個實例。你的類沒有一個,編譯器抱怨它。

爲什麼編譯器沒有合成默認構造函數?

一旦你爲你的類的編譯器不合成不帶任何參數爲你構造的任何構造函數,你必須提供自己,如果你的代碼使用之一。

解決方案:

有兩種方法來避免錯誤:

調用基類的適當的可用構造Catoegory子對象通過Member Initializer list。這消除了代碼使用無參數構造函數的場景。施工時

Category::Category() 
{ 

} 
+0

謝謝,這很好 – Aikiman001 2012-03-13 11:54:31

+0

偉大的,唯一的答案就是幫助我解決這個問題。 :D – lama12345 2015-07-15 23:02:28

0

在您的NumGame類中,您必須提供對基類構造函數的調用。如果你不這樣做,編譯器會使用默認構造函數爲你做:在你的案例Category(),你沒有..