如何在 C++ 中构建一个对象数组,这些对象都继承自一个主类?

Posted

技术标签:

【中文标题】如何在 C++ 中构建一个对象数组,这些对象都继承自一个主类?【英文标题】:How to build an array of objects in C++, that all inherit from a main class? 【发布时间】:2016-04-09 13:56:06 【问题描述】:

我是 C++ 新手,需要一些帮助。

我需要创建一个对象数组,据我了解,它是使用:

MyObject* instance = new MyObject[nb_of_instances_in_array];

虽然,它不太符合我的需求。

我有一个主对象,从中继承了 3 个具有不同方法和属性的其他对象。

mainObject

mainObject

现在我想创建一个可以包含 Object1s、Object2s 和 Object3s 的数组。我尝试做类似的事情:

int nb_of_obj, i;
cin >> nb_of_obj;
mainObject* arrayOfMainObjects = new mainObject[nb_of_obj];
for(i = 0;i<nb_of_obj;i++)

//Menu to select Object to append to the array
 arrayOfMainObjects[i] = Object2(args...);\\there are between 3 and 5 args for each object

delete arrayOfMainObjects;

我还尝试了一种更面向 C 的方法,使用 stdlib.h 的 malloc 和 free。

using namespace std;

size_t max_size();
     return (size_t)(max(max(sizeof(Object1),sizeof(Object2)), max(sizeof(Object3), sizeof(mainObject))));

mainObject* arrayOfMainObjects = NULL;
arrayOfMainObjects = (mainObject*) malloc(nb_of_obj*max_size());
//Globally, same code than above
free(arrayOfMainObjects);

我不知道自己做错了什么,我什至尝试访问数组中的下一个“点”,执行以下操作:

*(arrayOfMainObjects + i*max_size()) = Object2(args...);

而不是:

arrayOfMainObjects[i] = Object2(args...);

【问题讨论】:

您实际上并没有告诉我们您尝试的方法有什么问题(并且通常不要在 C++ 中使用malloc,除非有特殊需要)。 我建议使用std::vector&lt;std::unique_ptr&lt;mainObject&gt;&gt; @πάνταῥεῖ 如果他的开销较低(在这种情况下只有真正使用数组的理由),那么使用 'std::vector<:unique_ptr>>' 会变慢它略微下降。 (用于创建和删除) 【参考方案1】:

让我们检查一下为什么以下行不适合您。

mainObject* arrayOfMainObjects = new mainObject[nb_of_obj];

arrayOfMainObject 中每个元素的大小为sizeof(mainObject)

如果继承的对象包含一些额外的数据,则从 mainObject 继承的对象将大于 mainObject。 例如sizeof(Object2)&gt;=sizeof(mainObject) // always true!

因此,当您尝试在数组中构造继承的 Objects 时,只有sizeof(mainObject) 的空间,其余的都被切掉了。

要解决此问题,您的数组可以包含指向 mainObject 的指针,并且您可以将指针强制转换为继承对象的类型。

但是现在,为了避免内存泄漏,数组中的每个指针都必须在不再使用时被释放。

您可以使用智能指针而不会出现问题。类似的东西

std::unique_ptr&lt;mainObject&gt;* arrayOfMainObjects = new std::unique_ptr&lt;mainObject&gt;[nb_of_obj];

编辑:不要忘记 delete arrayOfMainObjects 仍然需要。

【讨论】:

所以,如果我理解正确你在说什么,下面的代码应该可以工作: using namespace std;尺寸_t 最大尺寸();返回 (size_t)(max(max(sizeof(Object1),sizeof(Object2)), max(sizeof(Object3), sizeof(mainObject)))); mainObject* arrayOfMainObjects = NULL; arrayOfMainObjects = (mainObject*) malloc(nb_of_obj*max_size()); //全局,与上面相同的代码 free(arrayOfMainObjects);但事实并非如此。如果我尝试将超过 1 个对象附加到数组中,程序会崩溃。 @Dogeek 我认为这可能有效,但我可能完全错了。你能发布崩溃发生的代码吗?【参考方案2】:

保持简单:

class MyObject: public mainObject



MyObject* instance = new MyObject[nb_of_instances_in_array];

一切都会变得更容易。

【讨论】:

以上是关于如何在 C++ 中构建一个对象数组,这些对象都继承自一个主类?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的继承实现

面向对象之封装,继承,多态的理解

C++的黑科技(深入探索C++对象模型)

C++作为面向对象语言的三个基本特征:封装,继承和————

22. 啥是多态?

(C ++)如何在继承子类后删除基类?