【问题标题】:C++ initializer list for std::vector<obj*> as constructor parameterstd::vector<obj*> 的 C++ 初始值设定项列表作为构造函数参数
【发布时间】:2015-10-05 03:41:35
【问题描述】:

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

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

【问题讨论】:

  • 尼特:不要使用new,使用std::make_unique/std::unique_ptr&lt;&gt;
  • @MichaelAlbers,并不是真正的重复,因为您引用的那个使用的是 POD int,而这是一个 vector 的指针。不确定您是否可以从该问题的任何答案中获得该问题的答案,尤其是对于那些年长的人。

标签: c++ stl initialization


【解决方案1】:

你就快到了……

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 ....

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多