分配类c ++的数组

时间:2014-05-16 02:25:02

标签: c++

如何在不构造类的情况下分配类的数组,以便稍后填充数组?

我最初尝试使用

Myclass * array = new Myclass[N];

但是它试图将Myclass构造为N。

5 个答案:

答案 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)

或者,您可以使用boost::optional

所以在你的情况下:

std::vector<boost::optional<Myclass>> array(N);