std::vector<obj*> 的 C++ 初始化列表作为构造函数参数
C++ initializer list for std::vector<obj*> as constructor parameter
我有一种情况需要创建一个 class 的实例,其中包含许多对象指针参数。但是,我正在寻找一种更简单的方法。在此代码示例中,我非常笼统地演示了我正在尝试做的事情。
#include <vector>
#include <string>
class A
{
public:
A(std::string param);
};
class B
{
public:
B(std::vector<A*> params);
};
int main(int argc, char* argv[])
{
std::vector<A*> my_arguments;
my_arguments.push_back(new A("A1"));
my_arguments.push_back(new A("A2"));
my_arguments.push_back(new A("A3"));
my_arguments.push_back(new A("A4"));
B my_b = new B(my_arguments);
}
我不喜欢使用额外的 5 行来创建此调用的参数。有没有另一种方法可以做到这一点,需要更少的代码。我试过像这样使用数组,但它似乎不起作用:
B my_b = new B([new A("A1"), new A("A2"), new A("A3"), new A("A4")]);
我怎样才能得到类似的结果?我考虑过使用 va_list
,但这需要另一个参数来标记结束,或者变量数量的计数。这可能是我最终要做的,但是,还有其他策略吗?
你快到了......
B my_b{{new A("A1"), new A("A2"), new A("A3"), new A("A4")}};
注意:您的代码试图创建 B my_b
,它不是指针,因此您不需要使用 new
。外部 {
}
对围绕构造函数的参数,内部 {
}
对为 std::vector
构造函数创建一个 std::initializer_list
,所以其中的值用于构造 std::vector
参数。
请注意,自 C++11 以来就支持此语法 - 一些编译器需要命令行参数才能启用对 C++11 标准的支持,例如gcc -std=c++11 ...
.
我有一种情况需要创建一个 class 的实例,其中包含许多对象指针参数。但是,我正在寻找一种更简单的方法。在此代码示例中,我非常笼统地演示了我正在尝试做的事情。
#include <vector>
#include <string>
class A
{
public:
A(std::string param);
};
class B
{
public:
B(std::vector<A*> params);
};
int main(int argc, char* argv[])
{
std::vector<A*> my_arguments;
my_arguments.push_back(new A("A1"));
my_arguments.push_back(new A("A2"));
my_arguments.push_back(new A("A3"));
my_arguments.push_back(new A("A4"));
B my_b = new B(my_arguments);
}
我不喜欢使用额外的 5 行来创建此调用的参数。有没有另一种方法可以做到这一点,需要更少的代码。我试过像这样使用数组,但它似乎不起作用:
B my_b = new B([new A("A1"), new A("A2"), new A("A3"), new A("A4")]);
我怎样才能得到类似的结果?我考虑过使用 va_list
,但这需要另一个参数来标记结束,或者变量数量的计数。这可能是我最终要做的,但是,还有其他策略吗?
你快到了......
B my_b{{new A("A1"), new A("A2"), new A("A3"), new A("A4")}};
注意:您的代码试图创建 B my_b
,它不是指针,因此您不需要使用 new
。外部 {
}
对围绕构造函数的参数,内部 {
}
对为 std::vector
构造函数创建一个 std::initializer_list
,所以其中的值用于构造 std::vector
参数。
请注意,自 C++11 以来就支持此语法 - 一些编译器需要命令行参数才能启用对 C++11 标准的支持,例如gcc -std=c++11 ...
.