使用 a(n 空) 基类可以在同一容器中存储不同的对象
Using a(n empty) base class to enable storing different objects in the same container
假设我有两个完全不同的对象,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++ 中执行类型检查
谢谢何塞
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 线程上下文上的静态存储对象优化
- OOP - 存储对象和服务接口
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 是否保证在销毁所有线程本地存储对象后销毁全局对象
- 使用列表存储对象
- 在c++中存储一个对象或不存储对象的首选方式是什么
- 更好的是:存储对象与存储指针
- 应用程序使用QMAP存储对象时停止响应
- 使用堆栈存储对象
- 如何在 std::map 中存储"对象类型"?
- 我应该如何存储对象
- 在 c++ 中存储对象的最佳策略是什么,确保名称唯一并能够在以后有效地检索它们
- 用于存储对象列表的最佳标准类
- 在C++中存储对象地址的数据结构
- 函子如何维护/存储对象的状态
- 我如何定义一个向量,并用C++在其中存储对象
- 存储对象以备将来使用(在重新启动程序时)
- C++/JNI-存储对象(jobject)在向量和数组中发生意外更改,C++或JNI问题
- 在多个容器中存储对象的最佳实践