2012-08-09 55 views
1

我目前在我的一個項目(C++)中有相互包含的問題。與單身人士相互包容

通常情況下,如果我有一個相互包容的問題,我會很容易地向前任何聲明或重新設計類稍有解決它。但是這一次,我堅持:

我有一個名爲遊戲類,它創建並啓動核心遊戲系統,在其中的一個被稱爲GraphicsSystem。 在Game構造函數中,GraphicsSystem對象是動態創建的,並存儲在GraphicsSystem *指針中。看起來是這樣的:

Game::Game() 
{ 
    gfxSys = new GraphicsSystem(80, new Camera()); 
} 

現在我GraphicsSystem類需要在一個點上訪問遊戲類的方法來獲取玩家的對象,這是存儲在遊戲對象中。相應的部分看起來像這樣(遊戲是BTW單身!):

void GraphicsSystem::handleFrame() 
{ 
    ElementList elements = Game::instance()->getPlayer()->getEnvironment()->getElements(); 
} 

現在我試圖向前聲明在兩個方向了,但是這並不能滿足編譯器。我當然也可以將玩家指針放入圖形系統中,但我真的不想這樣做,因爲他不屬於那裏。

有什麼辦法來解決這個沒有我不必過多改變設計?我現在真的很難過,所以我希望你們能幫助我。

我正在使用Visual Studio 2010(Visual C++)。

預先感謝您! 克里斯

+0

您能否提供一些關於您嘗試向前申報時發生的情況的詳細信息?你的代碼文件的結構又是什麼?我的意思是相關的類是在哪些文件? – 2012-08-09 00:22:08

回答

1

在Game.h中正向聲明GraphicsSystem。在GraphicsSystem.h中包含Game.h,如果需要的話。在Game.cpp中包含Game.h和GraphicsSystem.h。在GraphicsSystem.cpp中包含Game.h和GraphicsSystem.h。 這應該基於你發佈的代碼工作。

+0

謝謝,我現在直接在Game.cpp中包含GraphicsSystem.h的事實修復了它。通常,除了相應的類聲明文件外(在Game.cpp中只包含一個Game.h包含),我絕不會在.cpp中包含另一個頭文件。在使用轉發聲明時,我是否應該只包含在.cpp中? – Chris 2012-08-09 01:10:18

+0

@Christoph如果在類的實現中必須使用不匹配的類(本例中爲GraphicsSystem類),則無論使用前向聲明,都需要包含頭文件,但是當您執行前向聲明,你幾乎總是必須包含另一個頭文件。 – JKor 2012-08-09 02:40:34

1

有打破循環依賴於C++兩種主要方式。

1)創建一個「接口」類,它列出了你的真實類和你真正的類繼承自實現的方法。那麼你可以包括那個,而不是真正的類的聲明。

2)平普爾 - 一類包含一個不透明的指針到它的真正的數據,求解具有以包括類型成員變量的聲明的問題。

0

我知道這是要健全狡猾,但你認爲拿着global reference到初始化Game類?

我知道全局是邪惡等等等等,我敢肯定,很多人會憤怒,但是以我個人經驗我不得不屈從於SingletonitisGame類(除其他),並發現有時它僅僅是沒有必要。

你需要問自己最大的問題是「誰是你想保護你的遊戲對象的?,是沒有任何理由需要每次您需要的請求實例我很確定,如果你的Game對象沒有初始化,你不會在你的引擎中做任何其他事情。

希望這可以幫助你以不同的方式思考事情,儘管它不直接回答你的問題。