我開始用C++編寫一個複雜的軟件體,它使用了其他幾個庫,我現在要寫的是我只想要有限數量的類訪問這些庫,但使用C++頭文件並且包含頭文件的對象也應該可以訪問類的依賴關係。什麼是最合適的方法呢?C++中的API設計
1
A
回答
0
如果庫中的對象僅包含指針或對來自受限制的庫的對象的引用,則可以在頭中向前聲明它們,而不是包含頭本身。例如,你可以這樣做
class restricted_lib_class1;
class restricted_lib_class2;
class my_class1 {
restricted_lib_class1 *restricted1;
restricted_lib_class2 *restricted2;
// Other class members
};
,而不是這樣的:
#include <restricted.h> // contains definitions of restricted_lib_class1 and restricted_lib_class2
class my_class1 {
restricted_lib_class1 *restricted1;
restricted_lib_class2 *restricted2;
// Other class members
};
與向前聲明的情況下,只有CPP文件需要包括restricted.h
頭。
當然,如果您必須包含「受限」類的實例或從它們繼承,那麼您就沒有辦法將其頭文件包含在頭文件中。
1
一個建議是使用pimpl或抽象的「接口」模式。
pimpl模式是您存儲指向正向聲明的實現類的指針的位置。
實施例:
blah.hpp
class foo
{
struct impl;
impl* myImpl;
public:
foo();
}
blah.cpp
#incldue <internalClass>
struct foo::impl
{
internalClass o;
};
foo::foo()
{
myImpl = new impl();
}
另一種選擇是有一個純虛抽象類(AKA一個接口)。 然後你有一個工廠函數(或工廠類)返回一個指向你的實現的指針。 因此,客戶端代碼永遠不需要看到實現中的成員。
實施例:
inter.hpp
class inter
{
virtual void doFoo() = 0;
inter* create();
};
realInter.hpp
class realInter: public inter
{
virtual void doFoo() { //blah blah blah}
internalClass aMember;
};
inter.cpp
#include <realInter.hpp>
inter* inter::create()
{
return new realInter();
}
+0
我剛纔想到的一個想法是在頭文件中使用#ifdef,在匹配的.cpp文件中使用#define,這樣所有其他類都無法使用或查看即時消息試圖隱藏的庫。後面的想法是限制來自外部庫的頭文件的暴露,以避免代碼無意中與它們交互 – 2012-03-08 05:13:48
相關問題
- 1. N層設計中的Web API C#
- 2. C++庫API設計問題
- 3. 如何設計C++ API
- 4. Asana API C#項目設計
- 5. 「api設計爲c + +」:C++丘疹訪問
- 6. C#中的Twitter API計數
- 7. 設計Rails的API
- 8. API的URL設計
- 9. API的Python設計
- 10. RESTful API的設計
- 11. C++遊戲設計 - 什麼庫/ API?
- 12. C++ API設計和錯誤處理
- 13. Objective-C封裝API設計方法
- 14. 谷歌分析數據API [C#設計]
- 15. REST API設計
- 16. JSON-API設計
- 17. iOS中的UI設計,C#
- 18. c sharp中的流設計
- 19. 在C#中接受多種選擇的API設計?
- 20. Java API設計 - 內部設計
- 21. Python API來設計
- 22. API認證設計
- 23. REST API URI設計
- 24. API設計問題
- 25. 移動API設計
- 26. 乾淨API設計
- 27. ServiceStack REST API設計
- 28. API交互設計
- 29. 設計和OmniAuth api
- 30. REST JSON API設計
這是呼叫編輯「使用[不透明指針](http://en.wikipedia.org/wiki/Opaque_pointer)。」 – 2012-03-08 04:32:08