11

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

class Level { };

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

4

2 回答 2

11

正确的前向声明很简单:

class Level;

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

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

class Level;

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

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

// 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);
}
于 2013-05-28T22:29:05.903 回答
1

你有两个选择:

  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();
}
于 2013-05-28T22:28:59.337 回答