1

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

4 回答 4

3

不是C++ 方式。您应该使用模板。

如您所知,STL(您在使用std::命名空间前缀时调用它)实际上是标准模板库:)。许多模板类已经存在,例如对于推送/删除操作,请参见std::list<T>

你像这样使用它:

std::list<Sprite> SpriteContainer;
std::list<PhysicsData> PhysicsDataContainer;

等等。

如果您仍然想编写自己的类以获得更多功能,那么有一个关于 C++ 模板的很酷的指南。
如果问题是您想要做的实际事情,还有对 , 的引用std::list(我认为我不需要为您解释用法)。std::vector

于 2012-10-16T21:02:17.200 回答
3

您在 C++ 中使用模板,但仍然担心有一个普通容器的通用基类?

template <class T>
class Container{
  private:
    vector<T> list;
  public:
    void Push(T data);
    T Pop();
};
于 2012-10-16T21:02:41.440 回答
1

如果您将单个虚函数放入基类中,如果您在同一个容器中混合不同类型,您将能够使用它dynamic_cast来取回正确的指针。虚拟析构函数将是一个好主意,因为如果它是动态分配的,您可以删除该对象,而不必将其转换回原始指针。

如果您打算在单个容器中混合类型,我同意 dreamzor的观点,即模板类会更好。这就是所有标准容器的实现方式。

于 2012-10-16T21:04:27.060 回答
0

这看起来像是技术上正确的代码,但您没有进行任何类型检查。如您所见,PhysicsData 显示在您的 SpriteContainer 中。你可能不想要这个。

将 PhysicsData 排除在 SpriteContainer 之外的方法不止一种。一种方法是使用模板。使用模板,您可以在编译时声明容器应该使用哪种类型的基础对象。

另一种方法是从您的 ContainerManager 继承两种类型的 ContainerManager,一种称为 PhysicsContainerManager,另一种称为 SpriteContainerManager。这两个子类可以进行类型检查以验证传递的对象实际上是 SpriteContainer 还是 PhisicsData。此链接显示了如何在与 instanceof 等效的 c++ C++中进行类型检查

谢谢何塞

于 2012-10-16T21:20:50.650 回答