使用 a(n 空) 基类可以在同一容器中存储不同的对象

Using a(n empty) base class to enable storing different objects in the same container

本文关键字:存储 对象 基类 使用      更新时间:2023-10-16

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

这是应该下注的方式吗?

这不是

一个C++的方法。您应该使用模板。

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

你像这样使用它:

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

等等。

有一个关于C++模板的很酷的指南,如果你仍然想做自己的类来获得更多功能。
并且有一个关于std::list的参考,(我认为我不需要为你解释std::vector的用法)如果问题是你想做的实际事情。

您在C++中拥有模板,并且仍然担心为一个琐碎的容器提供一个公共基类??

template <class T>
class Container{
  private:
    vector<T> list;
  public:
    void Push(T data);
    T Pop();
};
如果将

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

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

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

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

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

谢谢何塞