我一直收到这个错误:没有匹配函数来调用'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。
答案 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;
}