如何在不构造类的情况下分配类的数组,以便稍后填充数组?
我最初尝试使用
Myclass * array = new Myclass[N];
但是它试图将Myclass构造为N。
答案 0 :(得分:2)
首先声明它而不分配
Myclass * array[N];
当你需要它时
for(int i=0;i<N;i++){
array[i] = new Myclass(/*params*/);
}
但如果您不必自己管理记忆,请考虑使用std::vector/std::list
。
答案 1 :(得分:0)
如果你真的想这样做,(不知道为什么),你可以试试
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass()
{ cout << "helo" << endl; }
};
int main(int argc, char *argv[])
{
int size = 4;
// Here is the trick, pointer to pointer.
MyClass **vec = new MyClass *[size];
cout << "before" << endl;
for (int i = 0; i < 4; ++i)
vec[i] = new MyClass;
// remember to free the vec
return 0;
}
答案 2 :(得分:0)
有人建议放置新的,所以在这里:
// allocate space
std::vector<unsigned char> mybuffer(N * sizeof(Myclass));
Myclass *array = reinterpret_cast<Myclass *>(&mybuffer[0]);
// when you're ready to use it
new( &array[0] ) Myclass(2);
new( &array[1] ) Myclass(3);
// etc...
// when you're done with it
array[0].~Myclass();
array[1].~Myclass();
// etc....
当然,在array[x]
之前使用new
或在调用析构函数之后使用{{1}}是未定义的行为。
这通常是您不能用作解决“正常”问题的方法。考虑实际定义一个什么都不做的默认构造函数,并且有一个稍后调用的函数,它会将对象增强到超出默认状态。
答案 3 :(得分:0)
如果您可以使用C ++ 11,那么最佳解决方案可能是std::vector<MyClass>
emplace
- 基础插入:
class MyClass {
public:
MyClass(int a, bool b, char c); // some non-default constructor
MyClass(double d); // another constructor
void bar();
};
void foo(int n) {
std::vector<MyClass> mv;
mv.reserve(n); // not even needed but beneficial if you know the final size.
// emplace_back uses perfect forwarding to call any arbitrary constructor:
mv.emplace_back(2, false, 'a');
mv.emplace_back(3, true, 'b');
mv.emplace_back(3.1415926535);
// can iterate vector easily:
for (auto &i : mv) {
i.bar();
}
// everything destructed automatically when the collection falls of scope ...
}
这会直接在没有副本的情况下创建集合中的值,并且在您准备好之前推迟任何元素构造,这与new[]
不同,后者在数组创建时创建了一堆默认对象。它通常比放置new
更好,因为它不会留下错过破坏或破坏无效内存位置的开放机会,也更容易阅读。
答案 4 :(得分:0)