如何使用c ++中的构造函数动态声明对象数组

时间:2011-12-11 09:04:45

标签: c++

我想知道当对象需要将构造函数传递给它时是否可以创建一个对象数组。我想要这样的东西:

MyClass *myVar;
myVar = new MyClass[num];  // I would like to specify the array size after declaration
int i = 0;
for(i = 0;i < num;i++)
   myVar[i] = new MyClass(0,0);  // I would also like to populate the array with new objects

我知道这有效:

MyClass *myVar;
myVar = new MyClass[num];

但这仅在构造函数没有传递给它时才有效。我正在尝试做什么?如果是这样,我该怎么做?

编辑:我发现如何使用数组来完成它。我是这样做的:

MyClass **myVar;
myVar = new MyClass *[num];
for(i = 0;i < num;i++)
   myVar[0] = new MyClass(0,0);

我会使用矢量等,但我的老师告诉我们尽可能使用基本数组。上面的解决方案我实际上是从老师写的一些代码中得到的。谢谢大家的帮助!

6 个答案:

答案 0 :(得分:24)

MyClass *myVar;
myVar = new MyClass[num];

实际上在这种形式下你不能调用带参数的构造函数。语言规范不允许这样做。

但是,如果您使用我建议您使用的std::vector,那么您可以创建一个调用非默认构造函数的向量:

#include <vector> //header file where std::vector is defined

std::vector<MyClass>  arr(num, MyClass(10,20));

它创建了一个num元素的向量,每个元素都是通过调用类的copy-constructor创建的,并将MyClass(10,20)作为参数传递给它。

矢量也很好,因为现在你不需要自己管理内存。既不手动分配,也不手动释放。另外,您可以随时致电arr.size()来了解元素的数量。您总是知道向量包含多少元素。您也可以随时添加元素,只需将.push_back()成员函数调用为:

即可
arr.push_back(MyClass(20,30)); 

现在您可以访问元素,就像访问数组一样,即使用索引:

f(arr[i]); // 0 <= i < arr.size();

此外,您可以使用便于惯用编程的迭代器,使您能够使用<algorithm>标题中的各种算法函数:

#include <algorithm> //header file where std::for_each is defined

std::for_each(arr.begin(), arr.end(), f);

其中f是一个函数,它取一个类型为MyClass&(或MyClass const &)的参数,具体取决于您在f中要执行的操作。

在C ++ 11中,您可以将lambda用作:

std::for_each(arr.begin(), arr.end(), [](const MyClass & m)
                                      {
                                           //working with m 
                                      });

答案 1 :(得分:7)

在C ++ 0x中,这个语法有效,它可以在新表达式中调用非默认构造函数:

MyClass *myVar;
myVar = new MyClass[2]{{10, 20},{20, 30}};

但我怀疑它是否只在运行时可用的元素数量有效。

矢量方法会更好,如Nawaz的回答所示。

答案 2 :(得分:3)

我过去做过这种方法的一种方法是使用双指针。

MyClass ** myvar;
myvar = new Myclass*[num]
for(int i = 0; i < 4; i++){
*(myvar+i) = new Myclass(i);}

适用于您可以想象的几乎任何控制结构,唯一的挫折是对象不一定在堆上连续。

答案 3 :(得分:1)

您也可以这样做:

MyClass *myVar[num];

for(int i = 0; i < num; i += 1)
{
    myVar[i] = new MyClass(0, 0);
}

答案 4 :(得分:0)

实际上,您可以使用新的展示位置来处理此问题:

MyClass * myVar;
myVar = reinterpret_cast<MyClass *>(new char[num * sizeof(MyClass)]);
int i = 0;
for (i = 0; i < num; i++) {
    new(&myVar[i]) MyClass(0,0);
}

答案 5 :(得分:0)

@Nawaz的回答对于使用向量真的很好,但对我却不起作用,因为它会创建相同对象的向量(所有对象都引用同一对象)

class Graph
{
 public:
  Graph(long V); // none default Constructor
}
std::vector<Graph>  myGraph;
for (int i = 0; i < T; i++) // read all graphs
    {
        Graph newGraph(N);
        myGraph.push_back(newGraph);
    }