2012-03-08 60 views
1

我開始用C++編寫一個複雜的軟件體,它使用了其他幾個庫,我現在要寫的是我只想要有限數量的類訪問這些庫,但使用C++頭文件並且包含頭文件的對象也應該可以訪問類的依賴關係。什麼是最合適的方法呢?C++中的API設計

回答

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頭。

當然,如果您必須包含「受限」類的實例或從它們繼承,那麼您就沒有辦法將其頭文件包含在頭文件中。

+0

這是呼叫編輯「使用[不透明指針](http://en.wikipedia.org/wiki/Opaque_pointer)。」 – 2012-03-08 04:32:08

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