4

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

int * somePtr = new int[5];

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

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

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

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

4

2 回答 2

3

new表达式只允许默认初始化,您不能在单个new表达式中执行此操作。您可以做的是分配原始内存并使用placement new 一个一个地构造对象(请参阅Object array initialization without default constructor中的这个答案

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

std::vector<IntegerSet> integers(5, IntegerSet(this->getLength()) );
于 2013-09-25T05:56:58.470 回答
0

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

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

于 2013-09-25T09:26:59.320 回答