在不同类的构造函数中创建对象的动态数组

Posted

技术标签:

【中文标题】在不同类的构造函数中创建对象的动态数组【英文标题】:Creating a dynamical array of objects in the constructor of a different class 【发布时间】:2017-04-12 15:04:27 【问题描述】:

我头疼。下面的代码 sn-p 对吗?我想创建一个包含 19 个 B 对象的数组,其中包含另一个 X A 对象数组。 (X 是可变的,我的意思是 As 数组在 B 对象之间的长度可能不同)

稍后我想说类似B_obj[i].As[j].number = 0; (i = [0-18], j = [0 - 取决于对象])

例子:

class A

    public:
        A();

    private:
        char *arena;
        size_t size;
        int number;
;

A::A()

    size = 5;

    arena= (char *) malloc (size);

   ... some code ...


class B

    private:
        int counter;
        A* As;

    public:
        B();
;

B::B()

    counter = getMyNumber(); /* getMyNumber returns an individual ID */
    As= (A*) malloc(counter * sizeof(A)));


B B_obj[19];

内存分配正确吗?一切都必须设置好,我以后不能分配额外的内存。

【问题讨论】:

每当你想到“动态数组”,你下一个想到的应该是std::vector 1.不要在 C++ 中使用 malloc(某些高级情况除外) 2. 不要使用原始数组(首选 std::vector 并且从不使用malloc在C++中分配内存。虽然它可以分配内存,但它不会构造对象。 IE。在您的情况下,永远不会调用 A 构造函数。使用std::vector当然可以解决分配和构造问题。 @Someprogrammerdude 谢谢你的建议。我选择了 malloc,因为我必须使用一个类似的函数,它只返回一个指向某些内存的指针。我会尝试使用向量。您能否给我一个提示,关于如何调用 A 的构造函数?我需要改变什么? 这是 C++ 的优点之一。你不调用构造函数。如果您静态分配或使用new 分配,则会为您调用构造函数。 【参考方案1】:

我想创建一个包含 19 个 B 对象的数组,其中包含另一个 X A 对象数组。

class B 
    std::vector<A> x;
public:
    // your public interface here
;

B arr[19];

当您使用像std::vector 这样的良好 RAII 解决方案时,解决方案会变得非常简单,因为它会为您进行内存管理。内存是自动分配的,可以使用std::vector::reserve在vector中分配一定数量的A对象。

【讨论】:

以上是关于在不同类的构造函数中创建对象的动态数组的主要内容,如果未能解决你的问题,请参考以下文章

7中创建对象的方式(工厂模式构造函数模式原型模式动态原型模式等分析)

深入理解JavaScript中创建对象模式的演变(原型)

深入理解JavaScript中创建对象模式的演变(原型)

深入理解JavaScript中创建对象模式的演变(原型)

深入理解JavaScript中创建对象模式的演变(原型)

java中创建对象了,显示初始化值和构造函数初始化对象的区别?先后执行顺序是啥?