如何制作所有从一个基类继承的对象列表
Posted
技术标签:
【中文标题】如何制作所有从一个基类继承的对象列表【英文标题】:How to make a list of objects which all inherit from one base class 【发布时间】:2015-09-01 19:37:55 【问题描述】:我有一个主要的抽象类和 4 个子类,它们都继承自抽象类。 我想制作一个列表,其中一个元素可以是这 4 个类中的任何一个。
Test1.h
class Test
public:
Test();
virtual void someFunc();
void getTest();
void setTest(int test);
protected:
int test;
;
Test2.h:
#include "Test.h"
class Test2 : public Test
public:
Test2();
void someFunc();
int otherFunc();
;
还有Test3、Test4和Test5...
来源.cpp:
#include <iostream>
#include "Test1.h"
#include "Test2.h"
#include "Test3.h"
#include "Test4.h"
#include "Test5.h"
int main()
list<Test> testList; //does not work
Test2 t = Test2();
Test3 t3 = Test3();
Test4 t4 = Test4();
testList.push_back(t);
testList.push_back(t4);
有没有办法制作一个可以包含所有这些元素的列表?
【问题讨论】:
您是否希望列表拥有对象(即您是否希望在删除列表时删除它们)? 【参考方案1】:您可以创建基类Test
指针的向量,例如:
std::vector<Test*>
如果可以的话,我宁愿推荐使用智能指针,例如:
std::vector<std::unique_ptr<Test>>
【讨论】:
成功了!有没有办法可以设置向量的大小随着元素的添加而动态增加,而不必设置初始大小? 使用std::vector
,您不必自己增加大小。 push_back() 将为您完成工作。所以一定要使用std::vector
!【参考方案2】:
只要您不希望列表拥有对象,您就可以使用基类指针向量:
std::vector<Test*> testList;
Test2 t = Test2();
Test4 t4 = Test4();
testList.push_back(&t);
testList.push_back(&t4);
如果您希望列表拥有您需要动态分配对象的对象,则基类需要有一个虚拟析构函数,并且您需要记住删除指针或使用智能指针:
class Test
public:
virtual void someFunc();
virtual ~Test()
;
std::vector<std::unique_ptr<Test>> testList;
testList.push_back(std::make_unique<Test2>());
testList.push_back(std::make_unique<Test4>());
【讨论】:
以上是关于如何制作所有从一个基类继承的对象列表的主要内容,如果未能解决你的问题,请参考以下文章