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

Container of pointers with aggregate initialization

本文关键字:指针 初始化      更新时间:2023-10-16

问题的名称有点模棱两可,但我不知道它是如何称呼的。 我可以通过手动输入创建一个对象的容器,例如

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();

我不明白为什么它可能是错误的,我仍然怀疑。

这称为聚合初始化,要初始化指针向量,只需将向量类型定义为指针,并像初始化任何其他类型一样初始化它们:

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

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

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

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

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

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

有关指针和对象生存期的常见警告适用。尽量不要让它们晃来晃去。