c++面向对象设计

C++ Object Oriented Design

本文关键字:面向对象设计 c++      更新时间:2023-10-16
class Allegro {};
class Input
{
private:
    Allegro allegro1
};
class Graphics
{
private:
    Allegro allegro2
};
class Game
{
private:
    Input keyBoardinput;
    Graphics Gamegraphics;
};

在输入中,我需要访问与用户键盘输入相关的Allegro功能。在Graphics类中,我只想要能够让我在屏幕上绘制东西的函数,比如形状等。然而,Game类还需要在游戏运行时访问输入和图形功能。对我如何改进设计有什么建议吗?我知道我可以删除Graphics和Input类,并在Game类中保留所有Allegro功能,因为我想要做的是将执行和逻辑分开,并避免长类做太多事情。

显然,GraphicsInput应该与相同的Allegro类交谈。所以你应该这样做:创建Allegro类实例,然后在GraphicsInput的构造函数中使用该实例。

您的Game类应该创建Allegro的实例,并且应该将相同的实例传递给InputGraphics,后两者将简单地保存实例的引用

class Game
{
    Game() : allegro(/*..*/), keyBoardinput(allegro), Gamegraphics(allegro) {}
private:
    Allegro allegro; //actual instance 
    Input keyBoardinput;
    Graphics Gamegraphics;
};

注意Game中成员的顺序很重要。allegro应在keyBoardinputGamegraphics之前声明。这样可以确保allegro在其余两个之前创建,然后将allegro(完全创建的实例)传递给InputGraphics的构造函数。

然后确保InputGraphics持有allegro引用,该引用是从Game传递过来的。不要复制allegro:
class Input
{
public:
    Input(Allegro & allegro) : allegro1(allegro) {}
private:
    Allegro & allegro; //reference  - not copy!
};
class Graphics
{
public:
    Graphics(Allegro & allegro) : allegro1(allegro) {}
private:
    Allegro & allegro; //reference - not copy
};

请注意,所有这些类都使用了member-initialization-list,这在这里也是非常重要的。