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

31moq8wy  于 11个月前  发布在  其他
关注(0)|答案(6)|浏览(116)

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

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);


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

klr1opcd

klr1opcd1#

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

字符串
实际上,在这种形式下,你不能调用带参数的构造函数。这是语言规范所不允许的。
但是,如果你使用std::vector,我推荐你使用,那么你可以创建一个vector调用非默认构造函数:

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

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


它创建了一个num元素的向量,每个元素都是通过调用类的复制构造函数来创建的,并将MyClass(10,20)作为参数传递给它。
vector也很好,因为现在你不需要自己管理内存。既不需要手动分配,也不需要手动释放。另外,你可以随时通过调用arr.size()来知道元素的数量。你总是知道vector包含多少元素。你也可以随时添加元素,只需调用.push_back()成员函数:

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


现在你可以访问元素,就像访问数组一样,即通过使用index:

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 
                                      });

7uzetpgm

7uzetpgm2#

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

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

字符串
但我怀疑当元素的数量只在运行时可用时它是否有效。
矢量方法会更好,正如Nawaz的回答所示。

gmol1639

gmol16393#

指针到指针的指针等价于:

  • 指针数组
  • vector<T*>指针向量。

我过去使用的一种方法是使用双指针。这种方法消除了向量数据结构的开销,并且需要更好的内存效率。

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

字符串
几乎可以与任何你能想象到的控制结构一起工作。
缺点是内存分配不连续,可能会影响大量num s的速度。

aurhwmvo

aurhwmvo4#

你也可以这样做:

MyClass *myVar[num];

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

字符串

2skhul33

2skhul335#

实际上,你可以使用一个placement new来处理这个问题:

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);
}

字符串

mctunoxg

mctunoxg6#

@Nawaz answer在使用vector方面非常好,但对我不起作用,因为它创建了相同对象的vector(所有对象都引用同一个对象)

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);
    }

字符串

相关问题