std :: vector <obj *>的C ++初始化列表作为构造函数参数

时间:2015-10-05 03:41:35

标签: c++ stl initialization

我遇到需要创建具有许多对象指针参数的类的实例的情况。但是,我正在寻找一种更简单的方法。在这个代码示例中,我非常一般地展示了我尝试做的事情。

#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,但这需要另一个标记结尾的参数,或者变量数量的计数。这可能是我最终要做的事情,但是,还有其他策略吗?

1 个答案:

答案 0 :(得分:1)

你快到了......

B my_b{{new A("A1"), new A("A2"), new A("A3"), new A("A4")}};

注意:您的代码尝试创建的B my_b不是指针,因此您不需要使用new。外部{ }对围绕构造函数的参数,内部{ }对为std::initializer_list构造函数创建std::vector,因此其中的值用于构造std::vector参数。

请注意,自C ++ 11以来一直支持这种语法 - 某些编译器需要命令行参数来支持C ++ 11标准,例如: gcc -std=c++11 ...