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

class Level { };

但是,由于实体需要访问Level中的方法,因此它无法访问此类方法,因为它不知道它们的存在。有没有一种方法可以解决此问题而无需重新声明实体中大多数级别?

最佳答案

正确的前向声明很简单:

class Level;

注意缺少花括号。这告诉编译器,存在一个名为Level的类,但其中的内容一无所获。然后,您可以自由使用指向此未定义类的指针(Level *)和引用(Level &)。

请注意,由于编译器需要知道类的大小才能创建变量,因此无法直接实例化Level
class Level;

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

为了能够在Level的方法中使用Entity,理想情况下,您应该在单独的Level文件中定义.cpp的方法,并且仅在 header 中声明它们。将声明与定义分开是一种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);
}

关于c++ - 前向声明和循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16802485/

10-13 03:11