我已经使用SDL几天了,我决定在完成自己的Galaga克隆之后继续学习一些教程。但是,我在尝试为代码找到合适的布局时遇到了一些困难。
例如,我有一个如下定义的Spaceship类:
class Spaceship : public Sprite
{
public:
Spaceship(SDL_Surface *surface);
Spaceship(const char *filename);
void handleEvent(SDL_Event *event);
};
其中Sprite是一个保持屏幕位置的基类,依此类推。 我的构造函数类似于:
Spaceship::Spaceship(SDL_Surface *surface) :
Sprite(surface)
{
m_y = Game::screenHeight() - m_surface->h; //positions the ship at the bottom
}
从我所看到的,不可能使用Game :: screenWidth()[静态类],因为我需要包含“game.h”,它基本上是主要的游戏类,包括“spaceship.h” “,基本上创造了一个无限循环(我尝试过使用#ifndef等没有成功)。
所以,我的问题来了:
编辑:我找到了克服第一个问题的方法(我刚刚在cpp文件中添加了“game.h”,而不是在头文件中)。但是,我仍然想知道在这种情况下最好的设计选择是什么。
答案 0 :(得分:2)
如果您只想存储指针或对这些对象的引用,那么您可以使用class Game;
或class Spaceship;
转发声明一个或两个类。如果他们将这些对象作为参数或返回它们(除了一些例外,afaik),这也没关系。
如果你真的希望两者都有另一个的成员,那么不可能,因为每个对象都有一个自己的副本。
答案 1 :(得分:0)
您需要在依赖关系图中打破一个循环。
例如,可以向Spaceship类添加一个字段,以保存屏幕高度。