Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Liskov替换原理与游戏类设计_C++_Oop_Solid Principles - Fatal编程技术网

C++ Liskov替换原理与游戏类设计

C++ Liskov替换原理与游戏类设计,c++,oop,solid-principles,C++,Oop,Solid Principles,在我的游戏中,我定义了一个屏幕类,其中包含对许多可视实体对象的引用,这些对象可能会被绘制到显示器上: class Screen { public: private: std::vector<Entity*> entities_; }; 屏幕负责在其每个实体上调用Draw()函数 问题是,一些(但不是全部)实体也需要可更新,即随着时间的推移,它们将改变其外观/位置。屏幕还需要调用Update()函数,但仅适用于可更新的对象 我的问题是: 从具有更新功能的实体派生类是否有意义:

在我的游戏中,我定义了一个
屏幕
类,其中包含对许多可视
实体
对象的引用,这些对象可能会被绘制到显示器上:

class Screen {
public:

private:
  std::vector<Entity*> entities_;
};
屏幕
负责在其每个
实体
上调用
Draw()
函数

问题是,一些(但不是全部)
实体
也需要可更新,即随着时间的推移,它们将改变其外观/位置。
屏幕
还需要调用
Update()
函数,但仅适用于可更新的对象

我的问题是:


从具有更新功能的
实体
派生类是否有意义:

class Entity {
  public:
    void Draw();
  private:
    int xpos;
    int ypos;
};
class ChangingEntity : public Entity {
  public: 
     void Update(int time);
};
并使
屏幕
如下所示:

class Screen {
public:

private:
  std::vector<Entity*> entities_;
  std::vector<ChangingEntity*> changing_entities_;
};
类屏幕{
公众:
私人:
向量实体;
std::向量改变实体;
};
如果我执行上述操作,那么我只为每个
实体
调用
Draw()
,并对每个
更改属性
调用
Draw()
Update()


或者-我应该把
Update()
函数放在
Entity
中,如果一个
Entity
对象不能更新,那么
Update()
就没有实现了吗?

这里有一些东西可以改进

最好不要让实体自己绘制,使用单独的
draw()
函数或可绘制类()。在您当前的方法中,您正在创建任何需要绘图来扩展实体的类,下次您将发现一个类不需要是实体就可以绘图。因此,请使用单独的绘图函数

其次,您应该定义实体是什么,例如Ogre3D将定义为基于网格的离散、可移动对象的实例,我认为您当前的定义不够,它只包含位置和绘图功能。您可以将一个实体定义为一个可更新的对象,另一个名为
StaticEntity
的类不需要多态性。让场景有两个单独的列表,并且实际上能够更新对象,再次将渲染器与场景分离


第三,您的
屏幕
类应该被称为
渲染器
,并且可以根据静态类型注册渲染对象。您还可以有一个可绘制的界面。

如果您知道如何静态地将两个容器分开,则可以将两个容器分开。多态性是指当你静态地不知道要使用哪种类型时。你怎么说“如果你知道如何静态地将这两种类型分开”…你是说我是否可以明确地将它们分开,并且事先知道它们是什么类型?如果是这样的话,那么我可以这样做。“从实体派生类有意义吗”--目前可能没有,因为
Entity
并没有很好地设计用作基类。它有一个公共的非虚拟析构函数,这是个坏消息。对于基类,析构函数应该是虚拟的或受保护的。