在不同类的构造函数中创建对象的动态数组
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
对象。
【讨论】:
以上是关于在不同类的构造函数中创建对象的动态数组的主要内容,如果未能解决你的问题,请参考以下文章