所以这可能是vauge但是坚持下去,看看你是否能理解我想要到达的地方。
几个月前,我用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以及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
答案 0 :(得分: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();
等等。
答案 1 :(得分:1)
好的,上面的答案提示如何更改代码以删除命名冲突。
当然,这是一个选项,但假设您有两组内置于DLL(或共享对象)中的代码,并且您希望能够同时使用它们,即从外部应用程序加载游戏,而无需修改任何来源。
答案是使用动态库加载,这在其他方面也是一个优势。在UNIX系统中,使用dlopen()
打开库,指定完整路径或相对于LD_LIBRARY_PATH
环境变量可见的路径。在Windows系统上,调用是LoadLibrary()。
在UNIX中,然后加载导出的符号(如果使用gnu的可见性隐藏属性,则这将是专门标记的符号,如果可见性是默认值,则默认情况下将导出符号,除非另有特别标记),使用dlsym
。在Windows中,符号通常通过.def文件或__declspec(dllexport)
导出,并通过GetProcAddress
要做到这一点,你需要让你的游戏“可插入”系统,但你有这样的巨大优势,你可以稍后通过为它作为可插拔游戏编写一个新的库来添加更多游戏,并且然后可以将其作为插件加载到您的游戏引擎中。
当然,您的游戏可以共享公共库。例如,心脏和黑桃游戏可能会分享一组卡片的概念以及它们都是与惠斯特相关的游戏,因此有一个跟随诉讼并采取技巧的概念。
答案 2 :(得分:0)
处理命名冲突的常用方法是使用命名空间。