假设我有两个完全不同的对象,Sprite和PhysicsData。
我编写了一个空基类和一个容器类,可以将对象推送到容器或从容器中删除对象。
我创建了两个这样的容器来存储两个不同的对象 - Sprite和PhysicsData。 (不同的对象不在同一个类中)
class base
{
};
class ContainerManager
{
public:
std::vector<base*> list;
void Push(base *object);
void Remove(base *object);
};
class PhysicsData : public base
{
void applyGravity();
};
class Sprite : public base
{
void Draw();
};
ContainerManager SpriteContainer;
ContainerManager PhysicsDataContainer;
Sprite aSprite;
SpriteContainer.Push(&aSprite);
PhysicsData SomeData;
PhysicsDataContainer.Push(&SomeData);
这是应该打赌的方式吗?
答案 0 :(得分:3)
这是不一种C ++方式。你应该使用模板。
您要知道,STL(使用std::
命名空间前缀时调用的)实际上是标准模板库:)。很多模板类已经存在,例如对于推送/删除操作,请参阅std::list<T>
你这样使用它:
std::list<Sprite> SpriteContainer;
std::list<PhysicsData> PhysicsDataContainer;
等等。
There是一个关于C ++模板的很酷的指南,如果您仍想要自己的类来获得更多功能。
there是对std::list
的引用,(我认为我不需要为您解释std::vector
的用法)如果问题是您想要做的事情
答案 1 :(得分:3)
您在C ++中使用模板并且仍然担心为一个简单的容器创建一个公共基类吗?
template <class T>
class Container{
private:
vector<T> list;
public:
void Push(T data);
T Pop();
};
答案 2 :(得分:1)
如果将一个虚函数放入基类中,如果在同一个容器中混合使用不同的类型,则可以使用dynamic_cast
来取回正确的指针。虚拟析构函数是个好主意,因为如果对象是动态分配的,你可以删除该对象,而不必将其强制转换回原始指针。
如果您不要在单个容器中混合类型,我agree with dreamzor表示模板类会更好。这就是所有标准容器的实现方式。
答案 3 :(得分:0)
这看起来像技术上正确的代码,但您没有进行任何类型检查。因此,您可以看到PhysicsData出现在SpriteContainer中。你可能不想要这个。
将PhysicsData与SpriteContainer保持一致的方法不止一种。一种方法是使用模板。使用模板,您可以说明容器在编译时应该使用哪种类型的基础对象。
另一种方法是从ContainerManager继承两种类型的ContainerManagers,一种叫做PhysicsContainerManager,另一种叫做SpriteContainerManager。这两个子类可以进行类型检查,以验证传递的对象实际上是SpriteContainer还是PhisicsData。此链接显示了如何在c ++ C++ equivalent of instanceof
中进行类型检查感谢 何