1

所以这可能是模糊的,但坚持下去,看看你是否能理解我想要在这里得到什么。

几个月前,我使用 card.cpp、card.h、player.cpp player.h、display.h 和 display.cpp 创建了一个黑桃纸牌游戏(在 C++ 中)。

除了我自己,我的另一个同学创建了一个红心纸牌游戏(用 C++ 编写),它也使用了 card.cpp、card.h、player.cpp player.h、display.h、display.cpp 和 heart.cpp和hearts.h。

我正在尝试将这两个程序集成在一起,并添加更多功能,例如共享评分,但我真的没有前进的方向。

我制作了两个游戏对象,所以从我的 main.cpp 文件中我可以调用它们来启动它们,但我遇到的问题是显示类具有相同的确切功能,其中包含略微 tweeked 的代码。(播放器和卡片完全不同只是名称相同)所以我不能只使用一个 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

好的,上面的答案已经建议了如何更改代码以消除命名冲突。

当然,这是一个选项,但假设您有 2 组代码内置在 DLL(或共享对象)中,并且您希望能够同时使用它们,即从外部应用程序加载游戏,而无需修改任何源.

答案是使用动态库加载,这在其他方面也是一个优势。在 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 回答