2012-03-13 53 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(),你没有..