C++ C++;,对预处理器使用不同的类
我有不同的类C++ C++;,对预处理器使用不同的类,c++,class,preprocessor-directive,C++,Class,Preprocessor Directive,我有不同的类Case0,Case1,Case2,等等,我想使用一些预处理器#define在它们之间切换。它们都共享相同的接口(相同的公共方法),我可以使用OOP,但我更喜欢使用预处理器指令 现在我有一些类似的东西: #define CASECLASS Case0 //#define CASECLASS Case1 //#define CASECLASS Case2 #define CASE 0 class Main { public: CASECLASS *mycase; Ma
Case0
,Case1
,Case2
,等等,我想使用一些预处理器#define
在它们之间切换。它们都共享相同的接口(相同的公共方法),我可以使用OOP,但我更喜欢使用预处理器指令
现在我有一些类似的东西:
#define CASECLASS Case0
//#define CASECLASS Case1
//#define CASECLASS Case2
#define CASE 0
class Main {
public:
CASECLASS *mycase;
Main() {
mycase = new CASECLASS();
if(CASE==0) {
mycase->foo();
// something else
}
if(CASE==1) {
mycase->foo();
// something else
}
}
}
这样,每次我必须切换时,我必须更改定义CASECLASS
和CASE
。我想知道是否有更干净的方法
编辑:
我不想使用OOP,因为不同的类使用不同的库。这可能会影响编译时间,并且它们依赖于平台。我认为预处理器指令在这里是更好的选择。以下代码必须工作:
#ifdef CASE1
class1
{
};
#endif
#ifdef CASE2
class2
{
};
#endif
#ifdef CASE3
class3
{
};
#endif
和使用 如果它们都共享同一个界面,为什么还要在它们之间切换?这里有一些更好的主意 第一:把预处理器的魔力放在一个地方。将其放在标题中:
#if defined(PLATFORM_ONE)
#include "platform_one/implementation.hpp"
typedef PlatformOneImplementation TheClass;
#elif defined(PLATFORM_TWO)
#include "platform_two/implementation.hpp"
typedef PlatformTwoImplementation TheClass;
#else
#error No implementation available.
#endif
class TheClass {
public:
TheClass();
~TheClass();
// Public stuff goes here.
private:
struct Impl;
std::unique_ptr<Impl> pimpl;
};
这将是项目中唯一使用预处理器的地方。其他一切都只使用类,不依赖于平台。如果它是依赖的,那么实现类应该隐藏它
如上所述,使用项目配置进行切换
这里有一个更好的选择。将其放在标题中:
#if defined(PLATFORM_ONE)
#include "platform_one/implementation.hpp"
typedef PlatformOneImplementation TheClass;
#elif defined(PLATFORM_TWO)
#include "platform_two/implementation.hpp"
typedef PlatformTwoImplementation TheClass;
#else
#error No implementation available.
#endif
class TheClass {
public:
TheClass();
~TheClass();
// Public stuff goes here.
private:
struct Impl;
std::unique_ptr<Impl> pimpl;
};
这两个选项都比用预处理器开关乱扔代码要好得多。在这种情况下,我的典型建议是将不同的代码放在不同的源文件中,并使用构建工具选择在构建时生成其中一个源文件
您当然可以让它与预处理器技巧一起工作。但预处理器是一种容易出错的额外语言黑客,它会使源代码更难阅读和维护。最好尽可能避免使用它。“我可以使用OOP,但我更喜欢使用预处理器指令。”。。。还有,你的清理方法。<代码> CASE <代码>是C和C++中的保留词,所以可能不起作用。为什么,为什么,为什么,为什么,为什么?“OOP怎么了?”马特·彼得森:这是个问题的拼写错误,谢谢!为什么不呢?见编辑谢谢你的想法。我是C++新手,我不知道在大多数情况下该怎么做。我没想到这是一个如此糟糕的问题,但你的回答很清楚,谢谢!