一些简单的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
所以在这里,我试图弄清楚我应该如何在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
Run Code Online (Sandbox Code Playgroud)
5go*_*der 14
问题出在这里:
Stuff(Thing thing) {
this->thing = thing;
}
Run Code Online (Sandbox Code Playgroud)
当您进入构造函数的主体时,编译器已经初始化了对象的数据成员.但它无法初始化,thing因为它没有默认构造函数.
解决方案是告诉编译器如何使用initlizer列表初始化它.
Stuff(Thing thing) : thing(thing) {
// Nothing left to do.
}
Run Code Online (Sandbox Code Playgroud)
这样打字更少,代码更清晰,效率更高.(效率更高,因为如果要对变量进行初始化,那么为什么要先用不需要的值初始化它,只是为了尽可能快地分配另一个?当然,因为你当前的代码甚至没有编译,"更多高效"在这里是一个有点可疑的陈述."
| 归档时间: |
|
| 查看次数: |
8026 次 |
| 最近记录: |