假设我有这个结构:
struct MyStruct {
int field1;
char *field2;
MyStruct(int a, char* b): field2(b) {
field1 = doStuff(a);
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct();
}
据我所知,这不是一个聚合,因为我有一些构造函数。
我想要实现的是以自定义方式使用大括号初始值设定项,这意味着使用如下代码:
MyStruct x = { 1, "string" };
隐式调用正确的构造函数(在本例中为第一个)。
这有可能吗?
答案 0 :(得分:7)
你快到了。 MyStruct x = { 1, "string" };
称为复制列表初始化。它将尝试使用 braced-init-list 提供的参数从可用的构造函数构造MyStruct
您的问题是,您的构造函数需要char*
而"string"
是const char[N]
,可以衰减为const char*
,而不是char*
。所以做出改变的事情
struct MyStruct {
int field1;
const char* field2;
MyStruct(int a, const char* b): field2(b) {
field1 = a;
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct() {}
};
然后
MyStruct x = { 1, "string" };
会工作吗?如果您想要更加防弹,可以将field2
更改为std::string
并使用
struct MyStruct {
int field1;
std::string field2;
MyStruct(int a, const std::string& b): field1(a), field2(b) {}
MyStruct(int a): MyStruct(a, "") {}
~MyStruct() {}
};