如果一个类只有一个带有一个参数的构造函数,那么如何声明一个数组呢?我知道在这种情况下推荐使用矢量.例如,如果我有一个班级
class Foo{
public:
Foo(int i) {}
}
Run Code Online (Sandbox Code Playgroud)
如何声明包含10000个Foo对象的数组或向量?
CB *_*ley 15
对于数组,您必须在定义数组的位置为数组的每个元素提供初始值设定项.
对于矢量,您可以为矢量的每个成员提供复制实例.
例如
std::vector<Foo> thousand_foos(1000, Foo(42));
Run Code Online (Sandbox Code Playgroud)
fog*_*ogo 13
实际上,只要你使用初始化列表,就可以这样做
Foo foos[4] = { Foo(0),Foo(1),Foo(2),Foo(3) };
Run Code Online (Sandbox Code Playgroud)
但是对于10000个物体,这绝对是不切实际的.如果编译器接受这么大的初始化列表,我甚至不确定你是否足够疯狂.
sbi对普通阵列有最好的答案,但没有给出一个例子.所以...
您应该使用新的展示位置:
char *place = new char [sizeof(Foo) * 10000];
Foo *fooArray = reinterpret_cast<Foo *>(place);
for (unsigned int i = 0; i < 10000; ++i) {
new (fooArray + i) Foo(i); // Call non-default constructor
}
Run Code Online (Sandbox Code Playgroud)
请记住,当使用placement new时,您负责调用对象的析构函数 - 编译器不会为您执行此操作:
// In some cleanup code somewhere ...
for (unsigned int i = 0; i < 10000; ++i) {
fooArray[i].~Foo();
}
// Don't forget to delete the "place"
delete [] reinterpret_cast<char *>(fooArray);
Run Code Online (Sandbox Code Playgroud)
这是您唯一一次看到对析构函数的合理显式调用.
注意:删除"地点"时,第一个版本有一个微妙的错误.将"地点"强制转换为新建的相同类型非常重要.换句话说,删除它时fooArray必须强制转换char *.请参阅以下评论以获得解释.