[英]Separating Interface and Implementation in C++
如果我有一個簡單的頭文件:
namespace aNamespace {
class AClass {
public:
AClass();
~AClass();
bool Init();
void Shutdown();
};
}
在相應的CPP文件中實現此類的“正確”方法是什么? 我可以看到兩個選項:
選項A
namespace aNamespace {
class AClass {
public:
AClass() { ... }
~AClass() { ... }
bool Init() { ... }
void Shutdown() { ... }
};
}
選項B
namespace aNamespace {
AClass::AClass() { ... }
AClass::~AClass() { ... }
bool AClass::Init() { ... }
void AClass::Shutdown() { ... }
}
我在選項B中看到的問題是,很難向AClass
添加特定於實現的成員-例如,如果實現需要std::wstring
或類似的存儲變量,該怎么AClass
? 但是該變量沒有在頭文件中定義嗎?
我之所以這樣問,是因為我可能希望有AClass
多個實現,並根據某個外部變量(例如目標平台或體系結構)選擇要鏈接的那個。
另一個選擇是實際指定每個實現平台的名稱,並在標頭中使用簡單的typedef開關來控制根據目標/體系結構選擇哪個:
#ifdef target1
typedef AClass Target1ClassImplementation;
#elif defined target2
typedef AClass Target2ClassImplementation;
#else
#error AClass is not implemented for current target
#endif
如果需要,可以將通用接口封裝在派生的基礎類中。 由於從某種意義上說哪個實現是針對哪個目標的,在更明確的意義上,它更不容易出錯,而無論標頭之外的平台目標如何,都允許使用AClass。
B在大多數情況下要好得多:
好處:
缺點:-CPP文件中的函數未在其他模塊中內聯(跨庫邊界)
最佳:確定每個功能的最佳選擇。 將一根短襯管連接到割台,將一根長襯管連接到cpp。 您可以為該類實現使用多個源文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.