C++ 不存在类错误的默认构造函数
一些简单的代码:C++ 不存在类错误的默认构造函数,c++,constructor,C++,Constructor,一些简单的代码: class Thing { public: int num; Thing(int num) { this->num = num; } }; class Stuff { public: Thing thing; // an instance of thing is declared here but it cannot construct it Stuff(Thing thing) { this
class Thing {
public:
int num;
Thing(int num) {
this->num = num;
}
};
class Stuff {
public:
Thing thing; // an instance of thing is declared here but it cannot construct it
Stuff(Thing thing) {
this->thing = thing;
}
};
int main() {
Thing thing = Thing(5);
Stuff stuff = Stuff(thing);
}
所以在这里,我试图弄清楚我应该如何在Stuff的构造函数中获取一个新的实例,而不指向它,因为我希望Stuff保存自己的副本。当然,我不能像上面那样声明东西,因为它试图初始化它
如何通过类的构造函数将新对象副本分配给类的变量
确切的错误是:
在构造函数“Stuff::Stuff(Thing)”中:
错误:调用“Thing::Thing()”时没有匹配的函数
东西{this->Thing=Thing;}
候选参数需要1个参数,提供0个
对象的唯一构造函数
采用int
参数
因此,当您声明:
Thing thing;
没有参数,它如何知道num
应该是什么
如错误所述,应为1,但未提供。您需要添加默认构造函数:
Thing::Thing(void) : num(0){};
或者修改参数:
Thing::Thing(int num=0)
在这两种情况下,我都使用了0
,但这应该是您认为的num
应该是“默认值”,而没有指定任何内容
如果没有这个选项,Stuff
的Thing
必须有一个值来初始化它;这是通过初始化列表来支持的,您忽略了在Thing::Thing
(见上文)中使用该列表,另外,您的this->num
是不必要的,num
就足够了
Stuff::Stuff(Thing inThing) : thing(inThing){};
使用初始值设定项列表初始化Stuff中的thing成员:
class Stuff {
public:
Thing thing; // an instance of thing is declared here but it cannot construct it
Stuff(Thing thing): thing(thing) { }
};
问题在于:
Stuff(Thing thing) {
this->thing = thing;
}
当您输入构造函数的主体时,编译器将已经初始化了对象的数据成员。但是它不能初始化东西
,因为它没有默认构造函数
解决方案是告诉编译器如何使用initlizer列表初始化它
这样打字更少,代码更简洁,效率更高。(效率更高,因为如果无论如何都要初始化变量,那么为什么要先用一个不需要的值初始化它,以便尽快地分配另一个值呢?当然,因为您当前的代码甚至还没有编译,“效率更高”这句话有点可疑。)正是我的问题。如何将Stuff类中Thing类型的副本存储为Stuff的任何成员都可以从任何方法访问的属性?@Jazcash在Stuff
构造函数的init列表中初始化它。一旦您为类Thing
显式声明了任何构造函数,则不会自动生成默认构造函数。完美答案,这就是我要找的,谢谢!没问题!为了避免混淆,我还将成员变量命名为不同的名称,如mThing或m_Thing。谢谢
Stuff(Thing thing) : thing(thing) {
// Nothing left to do.
}