繁体   English   中英

前向声明和循环依赖

[英]Forward declaration & circular dependency

我有两个类,实体和级别。 两者都需要访问彼此的方法。 因此,使用#include,就会出现循环依赖的问题。 因此,为了避免这种情况,我尝试在 Entity.h 中转发声明 Level:

class Level { };

但是,由于 Entity 需要访问 Level 中的方法,它无法访问这些方法,因为它不知道它们存在。 有没有办法在不重新声明实体中的大部分 Level 的情况下解决这个问题?

正确的前向声明很简单:

class Level;

请注意缺少花括号。 这告诉编译器有一个名为Level的类,但没有关于它的内容。 然后,您可以自由地使用指向此未定义类的指针 ( Level * ) 和引用 ( Level & )。

请注意,您不能直接实例化Level因为编译器需要知道类的大小才能创建变量。

class Level;

class Entity
{
    Level &level;  // legal
    Level level;   // illegal
};

为了能够在Entity的方法中使用Level ,理想情况下,您应该在单独的.cpp文件中定义Level的方法,并且只在头文件中声明它们。 将声明与定义分开是 C++ 最佳实践。

// entity.h

class Level;

class Entity
{
    void changeLevel(Level &);
};


// entity.cpp

#include "level.h"
#include "entity.h"

void Entity::changeLevel(Level &level)
{
    level.loadEntity(*this);
}

你有两个选择:

  1. 使用指针在这种情况下你的前向声明应该没问题。
  2. 内联一个类的方法,在这种情况下,如果包含 .h 文件,则可以使用另一个类的方法。

就我个人而言,我会沿着路径 1 走下去,它更干净并且可以更好地访问。 我使用了很多 shared_ptr 所以我不必担心删除...

Entity.h:
class Level;
class Entity {

private:
   Level* m_pLevel;

public:
   bool  CheckLevel ();
   bool WasItThere();


Level.h

class Entity;
class Level {

private:
   Entity* m_pEntity;



    public:
       public bool CheckMyStuff();
       public bool CheckItOut() { return m_pEntity->WasItThere();}
}


Entity.cpp

#include "Level.h"

bool Entity::CheckLevel () {
  return true;
}


bool Entity::CheckLevel() {
   return m_pLevel->CheckMyStuff();
}

bool Entity::WasItThere() {
   return true;
}



Level.cpp

bool Level::CheckMyStuff() { 
    return true;
}

bool Level::CheckItOut() { 
    return m_pEntity->WasItThere();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM