1

ですから、これは大げさかもしれませんが、私がここに到達しようとしていることを理解できるかどうかを確認してください。

数か月前、card.cpp、card.h、player.cpp player.h、display.h、display.cppを使用してスペードカードゲーム(C ++)を作成しました。

私と一緒に、クラスメートのもう1人が、card.cpp、card.h、player.cpp player.h、display.h、display.cpp、hearts.cppを使用するハートカードゲーム(C ++)を作成しました。 、およびhearts.h。

これら2つのプログラムを統合し、共有スコアリングなどの機能を追加しようとしていますが、実際に進む方向性はありません。

私は両方のゲームオブジェクトを作成したので、main.cppファイルから両方を呼び出して開始できますが、私が遭遇している問題は、表示クラスが同じ正確な機能を持ち、コードがわずかに調整されていることです(プレーヤーとカード同じ名前だけではまったく異なります)したがって、1つの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
4

3 に答える 3

3

宣言と定義を別々の名前空間に配置すると役立つはずです。

あなたが置くことができます

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

#includeハーツゲームに属するすべての.hおよび.cppファイル(ステートメントを除く)の宣言と定義の周り、および

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

#include他のゲームの宣言と定義(ステートメントを含まない)の周り。

両方のヘッダーを含むmain.cppでは、個々のタイプと関数を次のように参照できます。

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

等々。

于 2012-11-28T05:30:47.317 に答える
1

さて、上記の回答は、名前の衝突を取り除くためにコードを変更する方法を示唆しています。

もちろんこれはオプションですが、DLL(または共有オブジェクト)に2セットのコードが組み込まれていて、両方を操作できるようにしたい場合、つまり、ソースを変更せずに外部アプリケーションからゲームをロードしたいとします。 。

答えはダイナミックライブラリローディングを使用することであり、これは他の点でも利点です。UNIXシステムdlopen()では、フルパスまたはLD_LIBRARY_PATH環境変数に関連して表示されるパスを指定して、ライブラリを開くために使用します。Windowsシステムでは、呼び出しはLoadLibrary()です。

UNIXでは、エクスポートされたシンボルをロードします(gnuの可視性の非表示属性を使用する場合、これは明確にマークされたシンボルになります。可視性がデフォルトの場合、特にマークされていない限り、デフォルトでシンボルがエクスポートされます)dlsym。Windowsでは、シンボルは通常、.defファイルまたはを使用してエクスポートさ__declspec(dllexport)れ、GetProcAddress

これを行うには、ゲームをシステムに「プラグイン可能」にする必要がありますが、プラグイン可能なゲームとして新しいライブラリを作成するだけで後でゲームを追加できるという大きな利点があり、ロードできます。プラグインとしてゲームエンジンにインストールします。

もちろん、ゲームは共通のライブラリを共有できます。たとえば、ハートとスペードのゲームは、カードのパックの概念と、両方ともホイスト関連のゲームであるという事実を共有する可能性が高いため、スーツをフォローしてトリックを行うという概念があります。

于 2012-11-28T09:39:24.420 に答える
0

名前空間の競合に対処する通常の方法は、名前空間を使用することです。

于 2012-11-28T05:30:58.283 に答える