2016-07-05 35 views
1

的我有一個項目的應用程序文件,並在這個項目中,我有兩個文件夾「的流行爲」和「behaviour2」動態編譯依賴的#define

Application 
|_ behaviour1 
| |_ action 
| |_ action.h 
| |_ action.cpp 
| 
|_ behaviour2 
| |_ action 
| |_ action.h 
| |_ action.cpp 
| 
|_ behaviour_type.h 
|_ app.cpp 

凡action.h在每個目錄定義一個派生類從抽象類

class AbstractAction { 
    public: 
     virtual ~AbstractAction() = default; 
     virtual void Execute() = 0; 
} 

但是實現是不同的。

然後通過在 「app.cpp」 使用文件中的下一個代碼 「behaviour_type.h」

#define CURRENT_BEHAVIOUR bevahiour1 
#define QUOTEME_1(x) #x 
#define QUOTEME(x) QUOTEME_1(x) 
#define INCLUDE_FILE(x) QUOTEME(CURRENT_BEHAVIOUR/x) 

我可以寫

#include "behavior_type.h" 
#include INCLUDE_FILE(hook/action.h) 
... 
AbstractAction* action = new Action(); 
action->Execute(); 

但在這種情況下,兩個「行動。 h(來自行爲1和行爲2)將被編譯。我只想編譯一個,我也包括在內。是否可能 僅使用源代碼(即我的INCLUDE_FILE指令)編譯一個「action.h」文件,而不編譯器屬性。

可能是這個問題很愚蠢,對不起,但我是一個新手在這裏。 謝謝。

+3

這聽起來像一個不可維護的方法。爲什麼不製作兩個不同的課程?然後用類似「戰略模式」的東西來挑選合適的班級? – CoryKramer

+1

你不想接口和一個Factory類(或函數)。 –

+0

使用構建工具指定要構建的內容可能更容易:QMake,CMake或普通的舊Make。 –

回答

1

我不知道你的宏做或應該達到的,但爲什麼不使用簡單的變體:

#ifdef ACTION_1 
    #include "behaviour1/hook/action.h" 
#else 
    #include "behaviour2/hook/action.h" 
#endif 

AbstractAction* action = new Action(); 
action->Execute(); 

這麼說,我完全支持說,你應該同時擁有和使用的意見某種模式而不是條件編譯。

+0

正如我先前所說的,我決定使用不同的構建配置每個「行爲」並在每個配置中排除不必要的文件(項目 - >配置屬性 - >常規 - >從構建排除),但非常感謝你。 –