使用(n empty)基类来启用在同一容器中存储不同的对象

时间:2012-10-16 20:57:31

标签: c++ containers

假设我有两个完全不同的对象,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);

这是应该打赌的方式吗?

4 个答案:

答案 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

中进行类型检查

感谢 何