如何在C++中大括号初始化自定义类的向量



拥有以下简单代码:

#include <iostream>
#include <vector>
#include <string>
class Person{
public:
Person(std::string const& name) : name(name) {}
std::string const& getName() const {
return name;
}
private:
std::string name;
};
int main(){
//    std::vector<int> ar = {1,2,3};
std::vector<Person> persons = {"John", "David", "Peter"};
}

我收到错误:

could not convert ‘{"John", "David", "Peter"}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Person>’

那么,为什么ints的向量能够进行大括号初始化,而具有隐式构造函数的自定义类(具有std::string(却不能呢?如何启用它?

您只需要更多的大括号:

std::vector<Person> persons = {
{"John"}, {"David"}, {"Peter"}
};

问题是在初始化列表中使用(C样式(字符串文字,但矢量包含std::string。解决此问题的一种方法是传递std::string对象。这里有一种方法:

int main(){
using namespace std::string_literals;
std::vector<Person> persons = {"John"s, "David"s, "Peter"s};
}

或者,您可以为每个对象使用大括号初始化器,如另一个答案所建议的:

int main(){
std::vector<Person> persons = {{"John"}, {"David"}, {"Peter"}};
}

您可以向类中添加另一个接受const char*的构造函数,它应该可以在中工作

class Person{
public:
Person(const char* name): Person(std::string(name)) {}
Person(std::string const& name) : name(name) {}
std::string const& getName() const {
return name;
}
private:
std::string name;
};

或者像另一个答案中建议的那样,加上括号。

最新更新