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

时间:2017-04-09 17:04:53

标签: c++ arrays class pointers

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

在正常情况下,我使用它:

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

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

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

如何传递这两个参数?

2 个答案:

答案 0 :(得分:0)

我假设您的问题是:&#34;如何使用完全相同的构造函数调用初始化数组中的所有对象?&#34;

如果是这种情况,最简单的方法是使用std::vector's constructor (2)

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

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

  

然后你的例子变成:

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

如果您真的想使用C风格的数组,则必须使用 placement 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(); }

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

答案 1 :(得分:0)

没有语法可以列出 - 初始化动态分配的数组。

你必须

  • 1)默认构造,如您所示的示例,并在创建后修改对象。
  • 或2)分配足够大小的char数组,并使用placement-new构建对象。
如果类不是默认可构造的,则

1)不是一个选项。 2)有点复杂,但是你不必自己做,因为std::vector已经为你实现了它。无论如何你应该使用vector,因为它负责内存管理。

矢量示例,类似于您的正常情况&#34;。请注意您的正常情况&#34;与您问题中的描述不符:

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

带向量的示例,它与您将相同参数传递给数组中所有对象的描述相匹配。虽然从技术上讲,这个副本构造了数组元素:

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