首先,考虑基本结构。听起来您只想创建一个新的TestClass 并即时指定其初始值。
您可以使用构造函数来做到这一点:
/**
* TestClass.hpp
*/
class TestClass
{
public:
int a;
int b;
TestClass(int aInitial, int bInitial);
};
/**
* TestClass.cpp
*/
TestClass::TestClass(int aInitial, int bInitial)
: a(aInitial),
b(bInitial)
{
}
// ... which is the same as...
TestClass::TestClass(int aInitial, int bInitial)
{
this->a = aInitial;
this->b = bInitial;
}
/**
* SomewhereElse.cpp
*/
...
TestClass foobar(1, 2);
std::cout << foobar.a << std::endl; // 1
std::cout << foobar.b << std::endl; // 2
...
但是让我们假设您已经考虑过这一点并且您实际上确实需要使用列表初始化。答案实际上就在page you mentioned, 上,让我们继续扩展吧。
当你想用自定义类写这样的东西时......
TestClass foobar = { 1, 2 };
它首先需要一些手工工作。没有魔法可以自动将第 0 个索引分配给您的第一个成员,并将第一个索引分配给您的第二个成员。
编译器需要一个接受std::initializer_list的赋值运算符或构造函数:
/**
* TestClass.hpp
*/
class TestClass
{
public:
int a;
int b;
TestClass(std::initializer_list<int> list);
};
/**
* TestClass.cpp
*/
TestClass::TestClass(std::initializer_list<int> list)
{
if (list.size() != 2) {
// Throw an error or set some defaults
}
int i = 0;
for (int value : list) {
if (i == 0) {
this->a = value;
} else {
this->b = value;
}
i++;
}
}
这将做你期望它做的事情。但是那个构造函数很时髦,不是吗?我们必须做那个奇怪的for 循环,因为std::initializer_list 不提供对其值的索引访问(换句话说,你不能做list[0] 或list[1])。
您可以通过在构造函数中接受 std::vector(或其他类型的容器,如 std::array、std::list 等)来使此内容更易于阅读。
这是因为std::initializer_list 在那些容器中被接受为构造函数,并且可以执行隐式转换:
/**
* TestClass.hpp
*/
class TestClass
{
int a;
int b;
TestClass(std::vector<int> values);
};
/**
* TestClass.cpp
*/
TestClass::TestClass(std::vector<int> values)
{
if (values.size() != 2) {
// Throw an error or set some defaults
}
this->a = values[0];
this->b = values[1];
}