使用指针的具有多个参数的对象数组

array of objects with multiple parameters using a pointer

本文关键字:参数 对象 数组 指针      更新时间:2023-10-16

如何将类的两个参数切换到我正在使用指针创建的对象?语法是什么?(它们必须接收所有相同的参数(

在正常情况下,我使用这个:

MyClass obj[5]={MyClass(x,y)}

但。。。在这种情况下,语法是什么?:

MyClass *obj;
obj = new MyClass[5]; //Here! <----

如何传递这两个参数?

没有语法来列表初始化动态分配的数组。

你必须

  • 1( 默认构造,如您显示的示例所示,并在创建后修改对象。
  • 或者 2( 分配一个足够大小的 char 数组,并使用 placement-new 构造对象。

如果类不是默认可构造的,则 1( 不是一个选项。2(有点复杂,但你不必自己做,因为std::vector已经为你实现了它。无论如何,您都应该使用矢量,因为它负责内存管理。

一个带有矢量的示例,类似于您的"正常情况"。请注意,您的"正常情况"与问题中的描述不符:

std::vector<MyClass> v{
    {x1, y1},
    {x2, y2},
    ...
};

一个带有 vector 的示例,它符合将相同参数传递给数组中所有对象的描述。尽管从技术上讲,此复制构造数组元素:

std::vector<MyClass> v(5, {x, y});

我假设你的问题是:">如何使用完全相同的构造函数调用初始化数组中的所有对象?

如果是这种情况,最简单的方法是使用 std::vector 的构造函数 (2(:

     vector( size_type count, 
             const T& value,
             const Allocator& alloc = Allocator());

使用值为 value 的元素的 count 个副本构造容器。

然后,您的示例变为:

std::vector<MyClass> obj(5, MyClass{x, y});

如果确实要使用 C 样式数组,则必须使用放置new手动调用构造函数,如果要避免不必要的默认构造函数调用,则必须手动调用析构函数。例:

std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> obj[5];
for(auto& x : obj) { new(&x) MyClass{x, y}; }
// ... use `obj` ...
for(auto& x : obj) { reinterpret_cast<MyClass*>(&x)->~MyClass(); }

请注意,上面的代码可以(并且应该(重构为安全的抽象。