簡體   English   中英

前向聲明和循環依賴

[英]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. 使用指針在這種情況下你的前向聲明應該沒問題。
  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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM