不同文件中具有相同名称的不同类版本

时间:2011-10-06 12:56:47

标签: c++ file class

我在两个不同文件(A.cpp,A.h,B.cpp,B.h)中的同一个类的两个版本在所有文件中,该类具有相同的名称但内部实现不同。

我的想法是通过更改#include中.h文件的名称从一个版本切换到另一个版本,所以我不必更改代码中的任何其他内容(两个版本的方法都具有相同的签名和相同的属性)

A.h和B.h从不同时包含在内。

问题在于,无论我使用什么包含文件,都会执行一个版本。我知道当我包括B.h时,至少它被编译(通过在编译时显示一些代码错误)

可以这样做吗?或者这打破了C ++的一些规则?我认为这不应该打破一个定义规则,因为我不是同时使用A.h和B.h.

4 个答案:

答案 0 :(得分:2)

解决方案不将旧文件链接到最终的可执行文件中。这样,只有新的实现可用。

答案 1 :(得分:2)

我经常做的是将版本变成命名空间,并使用它。 有点像:

namespace Xyz_A {   //  In A.h
//  Define version A
}

namespace Xyz = Xyz_A;

B.h中,请改用_B

这样,您可以在程序中编写Xyz::...,但在外部编写 符号将Xyz_AXyz_B包含在其中。但在我的 选项,这实际上是一种防止错误的保护。我会安排 我的makefile中的内容,以便A.hB.h之间的任何切换 还会导致可执行文件链接到相应的库,并且 不要反对另一个。

答案 2 :(得分:0)

如果头文件相同,那么只有一个头和两个不同的实现文件会更容易。这会将您的问题减少到仅与正确的目标文件链接。如果你的标题出现分歧,这也减少了细微错误的可能性。

当然,更好的解决方案不依赖于构建系统,而是使用语言工具在编译时更改代码,如模板。

答案 3 :(得分:0)

您需要加载正确的库以匹配头文件。

我建议查看代理设计模式,这样你就可以包含A类和B类。然后你可以使用代理来选择在运行时使用哪个类函数。

http://en.wikipedia.org/wiki/Proxy_pattern