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++新手,我不知道在大多数情况下该怎么做。我没想到这是一个如此糟糕的问题,但你的回答很清楚,谢谢!