class 错误不存在默认构造函数

No default constructor exists for class error

一些简单的代码:

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 拥有自己的副本。当然,我不能像上面那样声明,因为它正在尝试初始化它。

如何解决通过其构造函数将新对象副本分配给 class' 变量的问题?

确切错误是:

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

Thing 的唯一构造函数采用 int 参数。

因此,当您声明时:

Thing thing;

没有参数,它怎么知道 num 应该是什么?

如错误所述,预期有 1 个,但 none 已提供。您需要添加默认构造函数:

Thing::Thing(void) : num(0){};

或者修改参数:

Thing::Thing(int num=0)

在这两种情况下,我都使用了 0,但是这应该是您认为 num 应该是 'by default' 的任何内容,当没有指定任何内容时。

没有这个,StuffThing必须有一个值来初始化它;这是通过初始化列表支持的,您在 Thing::Thing 中忽略了它(见上文),并且作为旁注,您的 this->num 不是必需的, num 就足够了。

Stuff::Stuff(Thing inThing) : thing(inThing){};

使用初始化列表初始化 Stuff 中的事物成员:

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;
}

当您进入构造函数的主体时,编译器已经初始化了您的对象的数据成员。但是它不能初始化thing,因为它没有默认构造函数。

解决方案是告诉编译器如何使用initlizer list.

初始化它
Stuff(Thing thing) : thing(thing) {
    // Nothing left to do.
}

打字更少、代码更简洁、效率更高。 (更高效,因为如果变量无论如何都要被初始化,那么为什么要先用一个不需要的值初始化它只是为了尽可能快地分配另一个值?当然,因为你当前的代码甚至没有编译,“更多高效”在这里是一个有点可疑的说法。)