动态分配对象数组

动态分配对象数组

这是一个初学者的问题,但我已经很长时间没有做C+了,下面是.

我有一个类,它包含一个动态分配的数组,比如说

class A{
    int* myArray;
    A()
    {
        myArray = 0;
    }
    A(int size)
    {
        myArray = new int[size];
    }
    ~A()
    {
        // Note that as per MikeB's helpful style critique, no need to check against 0.
        delete [] myArray;
    }}

但是现在我想要为这些类创建一个动态分配的数组。以下是我的当前代码:

A* arrayOfAs = new A[5];for (int i = 0; i < 5; ++i){
    arrayOfAs[i] = A(3);}

但这会爆炸得很厉害。因为新的A对象创建(使用A(3)(调用)在for循环迭代完成,这意味着内部myArray其中A实例获取delete []-艾德

所以我觉得我的语法肯定错了?我想有几个修复方法看起来有点过火,我希望避免:

  • 创建副本构造函数

    A.

  • 使用

    vector<int>

    vector<A>

    所以我不用担心这些。
  • 而不是

    arrayOfAs

    是一个数组

    A

    对象,它是否是

    A*

    指南针。

我认为这只是一些初学者的事情,在尝试动态分配具有内部动态分配的事物时,语法实际上是有效的。

(还有,风格批评很受欢迎,因为我做C+已经有一段时间了。)

为未来观众提供最新信息:下面的所有答案都很有帮助。因为示例代码和有用的“规则4”,Martin的代码被接受了,但我确实建议阅读它们。一些是好的,简洁的陈述什么是错误的,还有一些正确地指出了如何和为什么vector这是个很好的方法。


一只斗牛犬
浏览 644回答 3
3回答

喵喔喔

我建议使用std:载体:类似于typedef&nbsp;std::vector<int>&nbsp;A;typedef&nbsp;std::vector<A>&nbsp;AS;STL的轻微过度没有什么问题,你可以花更多的时间来实现你的应用程序的特定功能,而不是重新发明自行车。

慕莱坞森

A对象的构造函数动态分配另一个对象,并将指向该动态分配对象的指针存储在原始指针中。在这种情况下,你必定义您自己的复制构造函数、赋值运算符和析构函数。生成的编译器将不能正常工作。(这是“三大定律”的必然结果:具有任意析构函数、赋值运算符、复制构造函数的类通常需要全部3)。您已经定义了自己的析构函数(并且提到了创建副本构造函数),但是您需要定义三大构造函数中的另外两个。另一种方法是存储指向动态分配的指针。int[]会帮你处理这些事情。有点像vector<int>(如你所述)或boost::shared_array<>.要将其归结为-为了最大限度地利用Raii,您应该尽可能避免处理原始指针。由于您要求其他样式的批判性,次要的是当您删除原始指针时,您不需要在调用之前检查0。delete-&nbsp;delete通过不做任何操作来处理这种情况,这样您就不必将代码与检查混淆。
打开App,查看更多内容
随时随地看视频慕课网APP