我有两个类,Entity和Level。它们都需要访问彼此的方法。因此,使用#include会导致循环依赖的问题。为了避免这种情况,我在Entity.h中尝试前向声明Level:
class Level { };
然而,由于Entity需要访问Level中的方法,但它无法访问这些方法,因为它不知道它们的存在。是否有一种方法可以在不重新声明大部分Level中内容的情况下解决此问题?
我有两个类,Entity和Level。它们都需要访问彼此的方法。因此,使用#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
,最好将Level
的方法定义在一个单独的.cpp
文件中,并且只在头文件中声明它们。将声明与定义分离是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);
}
你有两个选择:
个人建议选择第一种方式,更加清晰,并且允许更好的访问。我经常使用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();
}