[英]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 走下去,它更干凈並且可以更好地訪問。 我使用了很多 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.