在处理我的小游戏时,我遇到了与循环依赖相关的问题。
说我使用了2个类和一个帮助程序命名空间(全部包括防护),其中Base是主游戏类,Player是玩家对象和Entity的子节点,并帮助负责处理tile碰撞的函数命名空间:
当我尝试编译代码时,Player不被识别为base.h中的类型说明符,我也得到一个未知的覆盖说明符。当我转发声明播放器时它是未定义的,虽然我包括player.h。 我一直在网上寻求解决方案,但圆形包含的典型解决方案似乎都不适用。如前所述,我尝试了各种前向声明的组合,但它只改变了错误的类型。
我想知道是否有人会注意到下面代码中的任何缺陷。
(请注意,我已将所有功能实现放在标题中仅用于演示目的,他们已经拥有自己的小cpp文件)
base.h
#include "player.h"
#include "level.h"
class Base{
static Base& instance()
{
static Base base;
return base;
}
Player player;
Level level;
}
entity.h
class Entity{
vec2 velocity; //Assume we are using the glm library
vec2 position;
virtual void update()
{
}
}
player.h
#include "helper.h"
#include "entity.h"
class Player:public Entity{
void update()
{
velocity=helper::tileCollision(velocity);
//Update position and stuff
}
}
helper.h
#include "level.h"
#include "base.h"
namespace helper{
vec2 tileCollision(vec2 velocity)
{
Level& level = Game::instance().level;
//Pop some fancy tile collision math in here
return vec2(0);
}
}
答案 0 :(得分:0)
首先,请不要在标题中编写函数的实现,除非它不是内联或模板。
尝试以下方法:
<强> base.h 强>
#include <memory>
class Player;
class Level;
class Base {
public:
static Base& instance();
private:
Base();
unique_ptr<Player> player;
unique_ptr<Level> level;
}
<强> base.cpp 强>
#include "base.h"
#include "player.h"
#include "level.h"
Base::Base() : Player(make_unique<Player>()), Level(make_unique<Level>())
{
}
static Base& Base::instance()
{
static Base base;
return base;
}
你应该注意以下几点: https://www.youtube.com/watch?v=QjFpKJ8Xx78