2012-11-28 73 views
1

所以這可能是無用的,但堅持下去,看看你是否能理解我想要得到的東西。集成多個C++程序

幾個月前,我用card.cpp,card.h,player.cpp player.h,display.h和display.cpp創建了一個黑桃紙牌遊戲(用C++編寫)。

除了我自己,我的另一個班級同學創建了一個使用card.cpp,card.h,player.cpp player.h,display.h和display.cpp的心靈卡片遊戲(在C++中)作爲hearts.cpp和hearts.h。

我想這兩個節目整合在一起,以及添加更多的功能,如共享的進球,但我真的沒有一個方向走。

我做了兩個遊戲對象,因此從我的main.cpp文件我可以調用它們來啓動它們,但是我遇到的問題是顯示類具有相同的確切功能,它們內部有微調的代碼(玩家和卡完全不同,只是同名)所以我不能只使用一個display.cpp。

我只是在尋找一些輕微的指導,如何去這樣做.....

謝謝!

而且我的目錄,如下所示

/proj2/Makefile 
/proj2/main.cpp 
/proj2/hearts/hearts.cpp 
/proj2/hearts/display.cpp 
/proj2/hearts/player.cpp 
/proj2/hearts/card.cpp 
/proj2/spades/spades.cpp 
/proj2/spades/display.cpp 
/proj2/spades/player.cpp 
/proj2/spades/card.cpp 

回答

3

把聲明和定義成不同的命名空間應該有所幫助。

你可以把

namespace hearts { 
    /* declarations/definitions from the hearts game */ 
} 

周圍所有的.h和.cpp文件中的聲明和定義(但不包括#include語句)屬於心靈的遊戲,

namespace spades { 
    /* declarations/definitions from the spades game */ 
} 

各地其他遊戲的聲明和定義(不包括#include聲明)。

在包括從兩個標頭一個main.cpp中,可以再參閱個別類型和函數作爲

hearts::player p; 
spades::function(); 

等。

+0

......當然兩個遊戲的共同來源和類別可以沒有'namespace',也可以添加'namespace cards {}'等。 – Potatoswatter

+0

這樣做後,我現在正在得到一個不尋常的錯誤。錯誤:'Card'之前的預期類型說明符。它是在我的代碼中引用這一行,hand [chosenIndex] = NULLCARD; hand []是在我的player.cpp中定義的,我使用的是心臟命名空間!我嘗試使用心::手牌定義手[13];和卡牌手[13]。我想也許它與我們在命名空間中有關,並且我指的是位於相同命名空間的Card? –

+0

@PeterBlum我們爲什麼不在這裏討論這個問題:http://chat.stackoverflow.com/rooms/20221/question-13598408 – jogojapan

0

處理命名衝突的常用方法是使用名稱空間。

1

好吧,上面的答案建議如何更改代碼以消除命名衝突。

這是一種選擇,當然,但假設你有2套的代碼內置到DLL文件(或共享對象),並且希望能夠與他們兩人的工作,即加載遊戲從外部應用程序,無需修改任何來源。

答案是使用動態庫加載,這在其他方面也是有利的。在UNIX系統中,您使用dlopen()來打開庫,可以指定完整路徑或相對於您的環境變量可見的路徑。在Windows系統上,調用是LoadLibrary()。

在UNIX中,然後加載導出的符號(如果使用gnu的可見性隱藏屬性,這將是專門標記的符號,如果可見性是默認的,則默認情況下導出符號,除非另有明確標記)。在Windows中,符號通常通過.def文件或通過__declspec(dllexport)導出,並通過GetProcAddress加載

要做到這一點,您需要將遊戲「插入」到系統中,您可以稍後添加更多遊戲,只需將它作爲可插入遊戲編寫一個新庫,然後將其作爲插件加載到您的遊戲引擎中即可。

當然你的遊戲可以共享共同的圖書館。例如,一場心臟和黑桃遊戲很可能會分享一副撲克牌的概念,以及他們都是與惠斯登有關的遊戲,所以這裏有一種跟風和花招的概念。