2014-02-27 70 views
0

由於循環依賴性,我遇到了在另一個對象中聲明外部對象的問題。考慮以下幾點:C++:Extern對象循環引用

的關卡編輯器對象包含的模塊陣列(所有模塊都editor_module的小孩):

#include "../Objects/editor_module.h" 
#include "Modules/collisionGrid_module.h" 
#include "Modules/HUD_module.h" 
#include "Modules/IO_module.h" 
#include "Modules/ledge_module.h" 
#include "Modules/segment_module.h" 

namespace g_editor 
{ 
    class LevelEditor 
    { 

但是模塊需要參考返回編輯器使用其功能:

#pragma once 

#include "../LevelEditor/LevelEditor.h" 
extern g_editor::LevelEditor g_levelEditor; 

namespace g_editor 
{ 
    class editor_module 
    { 

在編譯時,存在循環依賴性問題。是否有我忽略的設計考慮因素?

+1

可能希望查看轉發聲明。 –

+0

我的理解是,前向聲明不允許訪問已聲明對象的函數 –

+0

您在實現文件中包含頭部,以便您可以訪問函數但打破循環依賴關係。如果你使用內聯,它不是正確的解決方案。 –

回答

1

如果模塊只需要引用的類,那麼就不需要完整的類定義,只是一個向前聲明:

namespace g_editor {class LevelEditor;} 

任何代碼,例如在模塊的成員函數,這就需要完整的定義(例如訪問它的成員)將不得不放入包含頭文件的源文件中。但模塊的類定義本身不應該需要它。

+0

前向聲明只會導致以下錯誤:使用不完整類型的錯誤。有沒有辦法解決這個問題,或者我仍然錯過了一些東西? –

+0

@slippery_nipples:模塊類定義本身不應該需要完整的類型(假設它只聲明對「LevelEditor」的引用,就像你暗示的那樣)。它的一些成員函數可能需要完整的定義;正如我所說的那樣,這些函數定義必須放在源文件中。如果您嘗試將所有代碼放在標題中,則只應該遇到問題;我建議不要這樣做。 –

+0

好的,爲了澄清,如果editor_module使用像「addSegment(int x,int y)」這樣的LevelEditor函數,那麼我需要在editor_module.cpp中包含源代碼? –