【发布时间】:2013-11-18 09:32:45
【问题描述】:
我正在编写一个库,其中有一个 BaseClass 类。任何使用该库的人都将创建自己的继承自 BaseClass 的类。我还有一个类,我们称之为 Manager,它包含一个 BaseClass 指针向量,它可以包含从 BaseClass 派生的任何对象。
Manager 类必须处理添加到其 BaseClass 向量中的任何对象的创建和销毁。这是因为vector中的任何对象都可以随时删除,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() 函数工作?非常感谢您的帮助。
【问题讨论】:
-
修复代码以反映什么是类型的成员,什么不是。您还应该尝试进一步解释为什么您认为管理器需要创建对象,以及向量中的任何对象都可以随时删除的确切含义,谁将做删除? -- 你的
Add函数有什么问题? -
您的
Add函数有哪些问题?根据您的问题,我知道它不起作用,但我想了解更多详细信息,例如它是否无法编译/链接?它会导致分段错误吗?它是否返回错误的值? -
如果你有一个指向基类的指针并且基类有一个虚析构函数,那么通过指针删除对象是安全的。
-
@DaleWilson:这取决于很多事情......例如,如果用户获取指针并将其删除,那么下一个
Get请求可能会崩溃,所以这还不够 安全。但是这个问题没有很好的定义,所以很难提供一个好的答案。 -
我编辑了它。那是你想要的吗?我的库是一个基于组件的游戏引擎。 Manger 类实际上是一个 GameObject,而 BaseClass 实际上是一个 Component。库的用户可以创建新组件以添加到游戏对象。并回答谁将进行删除......任何事情都可以。任何东西都可以删除对象,任何东西都可以从游戏对象中删除组件
标签: c++ templates inheritance derived-class polymorphism