我在两个不同文件(A.cpp,A.h,B.cpp,B.h)中的同一个类的两个版本在所有文件中,该类具有相同的名称但内部实现不同。
我的想法是通过更改#include中.h文件的名称从一个版本切换到另一个版本,所以我不必更改代码中的任何其他内容(两个版本的方法都具有相同的签名和相同的属性)
A.h和B.h从不同时包含在内。
问题在于,无论我使用什么包含文件,都会执行一个版本。我知道当我包括B.h时,至少它被编译(通过在编译时显示一些代码错误)
可以这样做吗?或者这打破了C ++的一些规则?我认为这不应该打破一个定义规则,因为我不是同时使用A.h和B.h.
答案 0 :(得分:2)
解决方案不将旧文件链接到最终的可执行文件中。这样,只有新的实现可用。
答案 1 :(得分:2)
我经常做的是将版本变成命名空间,并使用它。 有点像:
namespace Xyz_A { // In A.h
// Define version A
}
namespace Xyz = Xyz_A;
在B.h
中,请改用_B
。
这样,您可以在程序中编写Xyz::...
,但在外部编写
符号将Xyz_A
或Xyz_B
包含在其中。但在我的
选项,这实际上是一种防止错误的保护。我会安排
我的makefile中的内容,以便A.h
和B.h
之间的任何切换
还会导致可执行文件链接到相应的库,并且
不要反对另一个。
答案 2 :(得分:0)
如果头文件相同,那么只有一个头和两个不同的实现文件会更容易。这会将您的问题减少到仅与正确的目标文件链接。如果你的标题出现分歧,这也减少了细微错误的可能性。
当然,更好的解决方案不依赖于构建系统,而是使用语言工具在编译时更改代码,如模板。
答案 3 :(得分:0)
您需要加载正确的库以匹配头文件。
我建议查看代理设计模式,这样你就可以包含A类和B类。然后你可以使用代理来选择在运行时使用哪个类函数。