c++ - 将一个类传递给另一个类的构造函数时,C++没有默认构造函数错误
问题描述
我正在编写一些 C++ 类,其中一个类具有另一个类的实例作为属性。在编写类构造函数时,我不断收到错误“Foo 类不存在默认构造函数”。这是一个重现错误的小示例:
class Foo {
int size;
char name;
Foo(int s,char n) {
size = s;
name = n;
}
};
class Bar {
int size;
char name;
Foo foo;
Bar(int s, char n,Foo f){
size = s;
name = n;
foo = f;
}
};
如果我删除 Foo 的类构造函数以便使用默认构造函数,则错误消失。由于我将 Foo 类的现有实例传递给 Bar 的构造函数,因此我不明白为什么错误会谈论 Foo 的构造函数。为什么会发生错误?以及如何修复代码?
解决方案
您应该通过初始化列表进行初始化,而不是通过赋值。
// You probably want these to be a struct, not class.
// This way all members are public by default.
struct Foo {
int size;
char name;
Foo(int s,char n) : size{s}, name{n} {}
};
struct Bar {
int size;
char name;
Foo foo;
Bar(int s, char n, const Foo &f) : size{s}, name{n}, foo{f} {}
};
当您不在初始化列表中初始化成员变量时,这与默认构造它然后重新分配值相同。所以你无缘无故地做了两倍的工作。(另见构造函数和成员初始化列表)
因为您已经为您的结构定义了一个构造函数,所以默认构造函数被隐式删除,这导致了您的编译错误。
附带说明一下,您甚至可能不需要这些构造函数,而是可以使用聚合初始化,如下所示:
struct Foo {
int size;
char name;
};
void example() {
Foo foo = {1, 'a'}; // the = is optional
}
推荐阅读
- laravel - 如何在后台运行脚本、命令并终止请求?
- firebase - Firebase Cloud Storage 签名的 url 上传失败,并显示“匿名调用者没有 storage.objects.create 访问权限”
- c++ - 我可以在不知道类型参数的情况下持有 shared_ptr 吗?
- python - 无法将 Numpy 数组转换为图像
- c# - 如何模拟测试类中私有对象的方法
- swift - 管理在 SpriteKit 场景中可见的 UI 动画
- c# - RSA.Encrypt() 和 RSA.EncryptValue() 之间的区别
- hadoop - 无法使用 Hadoop GCS 连接器在命令行中列出 GCS 存储桶中的文件
- javascript - JSON - 如何获取对象的“路径”
- node.js - 从 nodejs 服务器接收来自 ServiceBus 的 BrokeredMessage