我希望创建一个MyClass的向量,就像下面的Course类一样。 我希望传递一个字符串数组作为课程的名称。所以我写了
struct Course {
int id;
string name;
static int id_generator;
Course() {}
Course(string s);
};
Course::Course(string s) {
name = s;
id = id_generator++;
}
int Course::id_generator = 0;
这有效
string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
vector<Course> course_vector(begin(course_names), end(course_names));
但这不是
vector<Course> course_vector = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
error: could not convert ‘{"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Course>’
为什么呢?怎么做得更好?
答案 0 :(得分:4)
将聚合类型用于数组的聚合初始化:
string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
与initializer_list
初始化不同。 std::vector
提供了一个构造函数,它接收std::initializer_list<T>
,并且当您尝试使用大括号初始化vector
时调用的构造函数。为了使其正常工作,您需要为每个元素添加额外的大括号:
std::vector<Course> course_vector = {{"Linux"},
{"C++"},
{"HTML"},
{"HTML5"},
{"NodeJS"},
{"Shell"},
{"Python"}};
另外,我最好将构造函数更改为:
Course::Course(std::string const &s) : id(id_generator++), name(s) { }
答案 1 :(得分:2)
添加以下构造函数:
Course::Course(const char *s) : name(s) {
id = id_generator++;
}
这样,您就可以直接初始化矢量,就像您想要的那样。
答案 2 :(得分:0)
如果您使用的是c ++ 11或更高版本,则可以执行此类操作
std::vector<Course> vec = {Course("course1"), Course("course2"), Course("course3")};