我正在编写一个库,其中我有一个类 BaseClass。使用该库的任何人都将创建自己的继承自 BaseClass 的类。我有另一个类,我们称它为 Manager,它包含一个 BaseClass 指针向量,它可以包含从 BaseClass 派生的任何对象。
Manager 类必须处理添加到其 BaseClass 向量中的任何对象的创建和销毁。这是因为vector中的任何object都可以随时删除,Manager本身也可以删除。正因为如此,库的用户不能通过传递一个指向从 BaseClass 派生的现有对象的指针来将对象添加到 Manager 的 baseClass 向量。实际上,我可以允许用户这样做。但这将涉及复制一个虚拟对象,我宁愿不这样做。
为了解决这个问题,我正在尝试使用模板函数。当试图将它添加到管理器的向量时,用户应该传递从 BaseClass 派生的对象的类型。这是我目前拥有的。
//Manager.h
#include <vector>
#include "BaseClass.h"
#include <typeinfo>
class Manager {
//Vector holding pointers to any objects inherited from BaseClass
vector<BaseClass*> baseClasses;
//Template function that needs to add NEW object to baseClass vector
//This I'm having problems with
template<class T>
BaseClass* Add() {
BaseClass* baseClass = new T();
baseClasses.push_back(baseClass);
return baseClass;
}
//Template function that gets object from baseClass vector
//This works fine
template<class T>
BaseClass* Get() {
for (int i = 0; i < baseClasses.size(); i++) {
if (typeid(*baseClasses[i]) == typeid(T)) {
return baseClasses[i];
}
}
return NULL;
}
};
例如,用户在向 Manager 的 baseClass 向量添加或获取对象时应该这样做。DerivedClass 派生自 BaseClass
Manager manager;
//Add a new DerivedClass object to Manager's vector
manager.Add<DerivedClass>();
//Get a pointer to the DerivedClass object that was just added
DerivedClass* derivedClass = (DerivedClass*)manager.Get<DerivedClass>();
我的 Get() 函数工作正常。我需要知道的是,我怎样才能让我的 Add() 函数工作?帮助将不胜感激。