没有匹配的调用函数,但从未调用过那个确切的函数

时间:2013-12-01 19:21:45

标签: c++ class constructor

我一直收到这个错误:没有匹配函数来调用'Dog :: Dog()

它说我给出了0个参数,并且没有相应的功能。但事实上,我提供了一个像我打算做的那样的论点,但错误仍然存​​在。

我通过创建一个不带参数的构造函数进行了临时修复,只是将狗名称初始化为 “”

我的狗课

class Dog{
    string name;
public:
    Dog( string vName );
    string getName() { return name; }
};

初始化狗的一切

  • 人类

class Human{
    Dog myDog;
    string name;
    int age;
public:

  • 人工构造

•默认构造函数

Human::Human(){
    name = "undefined";
    age = 0;
    myDog = Dog("Jimmy");
}

•OverLoaded Constructor 1

Human::Human(string vName, int vAge){
    name = vName;
    age = vAge;
    myDog = Dog("Jimmy");
}

•OverLoaded Constructor 2

Human::Human(string vName, int vAge, Dog vDog){
   age = vAge;
   name = vName;
   myDog = vDog;
}

正如你所看到的,没有什么能用Dog()来初始化狗。所有内容都使用字符串初始化dog作为参数1。

4 个答案:

答案 0 :(得分:3)

Human的构造函数中,您尝试使用不存在的默认构造函数初始化Dog对象。发生这种情况是因为当您到达构造函数体时,应该已经构造了所有成员变量。如果您不使用initialization list,则选择的构造函数是默认构造函数(类Dog不存在)。

您可以使用如下的初始化列表来解决此问题:

Human::Human()
    : name("undefined")
    , age(0)
    , myDog("Jimmy")
    {}

Human::Human(string vName, int vAge)
    : name(vName)
    , age(vAge)
    , myDog("Jimmy")
    {}

Human::Human(string vName, int vAge, Dog vDog)
    : name(vName)
    , age(vAge)
    , myDog(vDog)
    {}

答案 1 :(得分:1)

在此行的Human课程中:

Dog myDog;

您确实使用默认构造函数创建了一条狗,因此它就是从中调用的地方。

Human构造函数中,您设置了myDog

myDog = Dog("Jimmy");

这将分为两个步骤:

  • 通过调用Dog构造函数创建一个新的临时Dog(string)对象。
  • 调用Dog的赋值运算符,将临时对象分配给Human类中包含的对象。

您可能想要做的是从myDog构造函数调用Human字段的特定构造函数:

Human::Human(): myDog("Jimmy") {
    name = "undefined";
    age = 0;
}

答案 2 :(得分:0)

在这个类的定义中

class Human{
    Dog myDog;
    string name;
    int age;
public:

用于创建对象myDog,调用类Dog的默认构造函数。但是,您没有在此类中定义默认构造函数。所以编译器会发出错误。

答案 3 :(得分:0)

在C ++实例中,在调用类的构造函数之前构造类。这是通过调用类的默认构造函数来完成的。这就是初始化的来源。

可以使用Human构造函数中的initializer list语法修复此问题:

Human::Human() : myDog("Jimmy") {  
    name = "undefined";
    age = 0;
}