我有两个班级:Generator
和Motor
。
这是Generator
的精简版本:
class Generator {
private:
Motor motor; // this will be initialized later
// However, this line causes the constructor to run.
public:
Generator(string);
}
Generator::Generator(string filename) {
motor = Motor(filename); // initialisation here
}
这是Motor类的定义:
class Motor {
public:
Motor();
Motor(string filename);
}
Motor::Motor() {
cout << "invalid empty constructor called" << endl;
}
Motor::Motor(string filename) {
cout << "valid constructor called" << endl;
}
这是我的main()
函数:
int main(int argc, char* argv[]) {
Generator generator = Generator(argv[1]);
....
....
}
输出为
无效的空构造函数称为
有效的构造函数称为
如何在不调用Generator
的空构造函数的情况下,将类Motor
定义为具有Motor
的实例?
我必须包括空的构造函数,因为g++
拒绝在没有它的情况下进行编译。
答案 0 :(得分:5)
您需要在Generator
构造函数中使用intialization list构造:
Generator::Generator(string filename) : motor(filename) // initialization here
{
// nothing needs to do be done here
}
您原始代码的实际作用是:
Generator::Generator(string filename) /* : motor() */ // implicit empty initialization here
{
motor = Motor(filename) // create a temp instance of Motor
// ^------------------- copy it into motor using the default operator=()
// destruct the temp instance of Motor
}