c++面向对象设计
C++ Object Oriented Design
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功能,因为我想要做的是将执行和逻辑分开,并避免长类做太多事情。
显然,Graphics
和Input
应该与相同的Allegro类交谈。所以你应该这样做:创建Allegro
类实例,然后在Graphics
和Input
的构造函数中使用该实例。
您的Game
类应该创建Allegro
的实例,并且应该将相同的实例传递给Input
和Graphics
,后两者将简单地保存实例的引用。
class Game
{
Game() : allegro(/*..*/), keyBoardinput(allegro), Gamegraphics(allegro) {}
private:
Allegro allegro; //actual instance
Input keyBoardinput;
Graphics Gamegraphics;
};
注意Game
中成员的顺序很重要。allegro
应在keyBoardinput
和Gamegraphics
之前声明。这样可以确保allegro
在其余两个之前创建,然后将allegro
(完全创建的实例)传递给Input
和Graphics
的构造函数。
Input
和Graphics
持有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,这在这里也是非常重要的。
相关文章:
- 分段错误(内核转储) C++面向对象编程
- 由于缺少类模板,NVCC 编译面向对象代码时出现问题
- 在C++面向对象程序中,谁负责删除传递给构造函数的对象
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 面向对象的设计选择
- 程序语言和面向对象语言的游戏设计差异
- 面向对象的数据设计
- 面向对象设计-将C应用程序转换为C++
- C++面向对象的客户端套接字应用程序设计
- 设计模式:可重用的面向对象软件的元素
- 设计面向对象的同步接收器和发射器
- 用C++实现面向对象设计中的内存管理
- C++中的面向对象设计问题
- 面向对象的酒店预订系统设计
- 面向对象设计播放器和AI控制单元.dynamic_cast
- c++面向对象设计
- 需要列表设计(面向对象)建议
- typeid()面向对象设计备选方案
- 在保持良好的面向对象设计的同时重用代码以提高性能的最佳方法是什么?
- c++面向对象设计受挫