簡體   English   中英

分離接口和C ++實現

[英]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在大多數情況下要好得多:

好處:

  • 隱藏實施細節。
  • 頭文件中的#include更少(暴露的依賴項更少!):
    • 更快的構建
    • 2個類可以調用彼此的函數。 如果兩者都在標頭中,則非常棘手。
    • 對實現的更改確實會影響其他類(構建時間)。

缺點:-CPP文件中的函數未在其他模塊中內聯(跨庫邊界)

最佳:確定每個功能的最佳選擇。 將一根短襯管連接到割台,將一根長襯管連接到cpp。 您可以為該類實現使用多個源文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM