动态创建的对象数组需要使用非默认构造函数,而我遇到的问题是语法。在我看来,我能够做到这一点
int * somePtr = new int[5];
意味着我应该能够做到这一点
IntegerSet* someSet = new IntegerSet(this->getLength())[5];
其中IntegerSet是我所做的一个表示整数集的类。这段代码发生在IntegerSets成员函数中。当我尝试这个时,我得到一个语法错误 “无法从IntegerSet转换为IntegerSet *”
我理解这意味着什么,这两种类型并不等同,但我看不出我在第1部分和第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()
使用非默认构造函数初始化数组的每个元素。