一些简单的代码:
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 的构造函数中获取 Thing 的新实例,而不指向它,因为我希望 Stuff 拥有自己的副本。当然,我不能像上面那样声明它,因为它正在尝试初始化它。
如何解决通过类的构造函数将新对象副本分配给类变量的问题?
确切的错误是:
In constructor 'Stuff::Stuff(Thing)':
error: no matching function for call to 'Thing::Thing()'
Stuff(Thing thing){ this->thing = thing; }
candidate expects 1 argument, 0 provided
问题就在这里:
Stuff(Thing thing) {
this->thing = thing;
}
当您进入构造函数的主体时,编译器将已经初始化对象的数据成员。但无法初始化thing
因为它没有默认构造函数。
解决方案是告诉编译器如何使用初始化列表.
Stuff(Thing thing) : thing(thing) {
// Nothing left to do.
}
这样打字更少,代码更干净,效率更高。 (更高效,因为如果无论如何都要初始化变量,那么为什么首先用不需要的值初始化它,然后尽快分配另一个值?当然,由于您当前的代码甚至无法编译,“更多高效”在这里是一个有点可疑的说法。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)