如何创建动态分配的对象数组而不使用默认构造函数?

时间:2013-09-25 05:55:15

标签: c++ object return

动态创建的对象数组需要使用非默认构造函数,而我遇到的问题是语法。在我看来,我能够做到这一点

int * somePtr = new int[5];

意味着我应该能够做到这一点

IntegerSet* someSet = new IntegerSet(this->getLength())[5];

其中IntegerSet是我所做的一个表示整数集的类。这段代码发生在IntegerSets成员函数中。当我尝试这个时,我得到一个语法错误 “无法从IntegerSet转换为IntegerSet *”

我理解这意味着什么,这两种类型并不等同,但我看不出我在第1部分和第2部分中所做的事情之间的区别,除了第2部分必须通过参数列表的事实作为构造函数。所以在我怀疑我的语法错误的那部分代码中

2 个答案:

答案 0 :(得分:3)

new表达式只允许默认初始化, 您无法在单new表达式 中执行此操作。您可以做的是分配原始内存并使用新的位置逐个构建对象(请参阅this answer中的Object array initialization without default constructor

或者甚至更好,不要使用C风格的数组。相反,使用一些STL容器,例如std::vector和它的构造函数,其中第二个参数是一个将用于初始化元素的值:

std::vector<IntegerSet> integers(5, IntegerSet(this->getLength()) );

答案 1 :(得分:0)

有一个简单的方法可以解决这个问题:向IntegerSet添加一个默认构造函数,它不会获取内存和任何其他资源。这样,您可以使用IntegerSet分配new数组,然后在下一步填充数组的每个元素。

更好的解决方案:使用std::vector<IntegerSet>emplace_back()使用非默认构造函数初始化数组的每个元素。