2012-03-08 12 views
1

他のいくつかのライブラリを使用する複雑なC++ソフトウェアを書き始めていますが、私の懸念事項は、これらのライブラリにアクセスするには限られた数のクラスにしたいが、C++ヘッダーヘッダーを含むオブジェクトもクラスの依存関係にアクセスする必要があります。これを取り巻く最も適切な方法は何ですか?C++でのAPI設計

答えて

0

制限付きライブラリのオブジェクトへのポインタまたは参照のみがライブラリのオブジェクトに保持されている場合、ヘッダー自体を含めるのではなく、ヘッダーで前方宣言できます。唯一のCPPファイルがrestricted.hヘッダーを含める必要があり、前方宣言の場合には

#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 
}; 

:たとえば、あなたはこの

class restricted_lib_class1; 
class restricted_lib_class2; 

class my_class1 { 
    restricted_lib_class1 *restricted1; 
    restricted_lib_class2 *restricted2; 
    // Other class members 
}; 

の代わりにこれを行うことができます。

"制限された"クラスのインスタンスを含めるか、継承する必要がある場合は、ヘッダーファイルにそのヘッダーを含めないでください。

+0

これは呼び出しです[不透明なポインタ](http://en.wikipedia.org/wiki/Opaque_pointer)を使って "ed" –

1

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を置くことで、他のすべてのクラスは隠すことを試みているライブラリを使用したり表示することができません。後のアイデアは外部のライブラリからヘッダーの公開を制限することで、偶然コードがそれらと相互作用しないようにすることです –