如何在 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<std::unique_ptr<mainObject>>
。
@πάνταῥεῖ 如果他的开销较低(在这种情况下只有真正使用数组的理由),那么使用 'std::vector<:unique_ptr>>' 会变慢它略微下降。 (用于创建和删除)
【参考方案1】:
让我们检查一下为什么以下行不适合您。
mainObject* arrayOfMainObjects = new mainObject[nb_of_obj];
arrayOfMainObject 中每个元素的大小为sizeof(mainObject)
。
如果继承的对象包含一些额外的数据,则从 mainObject 继承的对象将大于 mainObject。
例如sizeof(Object2)>=sizeof(mainObject) // always true!
。
因此,当您尝试在数组中构造继承的 Objects 时,只有sizeof(mainObject)
的空间,其余的都被切掉了。
要解决此问题,您的数组可以包含指向 mainObject 的指针,并且您可以将指针强制转换为继承对象的类型。
但是现在,为了避免内存泄漏,数组中的每个指针都必须在不再使用时被释放。
您可以使用智能指针而不会出现问题。类似的东西
std::unique_ptr<mainObject>* arrayOfMainObjects = new std::unique_ptr<mainObject>[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++ 中构建一个对象数组,这些对象都继承自一个主类?的主要内容,如果未能解决你的问题,请参考以下文章