我有两个类,实体和级别。两者都需要访问彼此的方法。因此,使用#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/