使用Singleton和子类的循环包含

时间:2017-03-26 11:38:41

标签: c++ inheritance singleton circular-dependency

在处理我的小游戏时,我遇到了与循环依赖相关的问题。

说我使用了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);
    }
}

1 个答案:

答案 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