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

use*_*276 25 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
Run Code Online (Sandbox Code Playgroud)

我知道这有效:

MyClass *myVar;
myVar = new MyClass[num];
Run Code Online (Sandbox Code Playgroud)

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

编辑:我发现如何使用数组.我是这样做的:

MyClass **myVar;
myVar = new MyClass *[num];
for(i = 0;i < num;i++)
   myVar[0] = new MyClass(0,0);
Run Code Online (Sandbox Code Playgroud)

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

Naw*_*waz 24

MyClass *myVar;
myVar = new MyClass[num];
Run Code Online (Sandbox Code Playgroud)

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

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

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

std::vector<MyClass>  arr(num, MyClass(10,20));
Run Code Online (Sandbox Code Playgroud)

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

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

arr.push_back(MyClass(20,30)); 
Run Code Online (Sandbox Code Playgroud)

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

f(arr[i]); // 0 <= i < arr.size();
Run Code Online (Sandbox Code Playgroud)

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

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

std::for_each(arr.begin(), arr.end(), f);
Run Code Online (Sandbox Code Playgroud)

其中f是函数,它取一个类型MyClass&(或MyClass const &)的参数取决于你想要做什么f.

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

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


fef*_*efe 7

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

MyClass *myVar;
myVar = new MyClass[2]{{10, 20},{20, 30}};
Run Code Online (Sandbox Code Playgroud)

但是我怀疑它是否在仅在运行时可用的元素数量时起作用.

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


小智 6

指向指针的指针等效于 1. 指针数组和 2. vector<T*> 指针向量。我过去这样做的一种方法是使用双指针。这种方法消除了向量数据结构的开销,并且需要优先的内存效率。

MyClass ** myvar;
myvar = new Myclass*[num]
for(int i = 0; i < num; i++){
*(myvar+i) = new Myclass(i);}
Run Code Online (Sandbox Code Playgroud)

几乎适用于您可以想象的任何控制结构。缺点是内存分配不连续,大量num影响速度。