【问题标题】: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 分配,则会为您调用构造函数。

标签: c++ arrays class constructor


【解决方案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对象。

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多