具有聚合初始化的指针容器

时间:2018-09-04 11:31:41

标签: c++

问题的名称有点含糊不清,但是我不知道如何称呼它。 我可以使用手动输入创建对象容器

std::vector<myobj> vec = 
{ 
{ /*All fields here*/ }, ... {/*Fields here*/}
};

但是指针呢?使用new来创建指针向量的正确语法是什么?

关于建议明确创建新对象的答案,这正是我要避免的事情。

我想到了:

std::vector<myobj*> vec = 
{ (new myobj{ /*fields*/ }) };

 ....

for (auto& c : vec) 
    delete c;
vec.clear();

我仍然不明白为什么这可能是错误的。

3 个答案:

答案 0 :(得分:3)

这称为聚合初始化,用于初始化指针向量,只需将向量类型定义为指针,然后像对其他任何类型一样将其初始化:

MyObjc myObj1* = new MyObj();
MyObjc myObj2* = new MyObj();

std::vector<MyObj*> vec = { myObj1, myObj2 };

请记住在创建这些指针后正确删除它们,或者考虑使用类似std:unique_ptr的指针。

参考:

https://en.cppreference.com/w/cpp/language/aggregate_initialization https://en.cppreference.com/w/cpp/memory/unique_ptr

答案 1 :(得分:2)

您可以在列表初始化中直接调用new

std::vector<myobj*> vec = {new MyObj(), new MyObj()}

您仍然必须设法delete将指针放在最后。

答案 2 :(得分:0)

简单。用指针替换每个{/* All fields here */}

myobj o1, o2;
std::vector<myobj*> vec = {
  &o1, &o2
};

关于指针和对象生存期的一般警告适用。尽量不要让他们晃来晃去。