C ++错误:没有适当的默认构造函数可用

时间:2011-12-06 17:10:41

标签: 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。

4 个答案:

答案 0 :(得分: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;
    }

};

在派生类和基类中都没有 Lice 成员。使其受到保护,以便派生类和子类重用相同的字段。

如果基类中有非默认构造函数,则必须使用派生类构造函数中的正确参数调用基类构造函数,如上所示。

此外,如果您使用继承,最好在基类中提供virtual destructo r。在您的示例代码中,问题可能并不明显。

答案 1 :(得分:2)

您需要从quad的初始化列表中调用tri的构造函数:

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

答案 2 :(得分:2)

当你构造一个类型为tri的类时,它会继承继承树并尝试创建一个四元组。它不能因为quad没有默认构造函数。要修复此错误,您可以显式调用quad的构造函数或提供将被调用的默认构造函数。

在C ++中,当没有给出构造函数时,会自动生成默认构造函数,但是一旦定义了任何构造函数,就不再自动生成默认构造函数。即使没有定义默认构造函数,也会发生这种情况。

答案 3 :(得分:0)

你是tri构造函数试图调用quad中的默认构造函数。您没有添加此代码,编译器为您确保正确初始化基类。

由于没有默认构造函数,因此您必须显式调用要使用的基础中的构造函数,即使只有一个构造函数。你会这样做的:

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

或者您希望传递给quad的任何适当参数。