他のいくつかのライブラリを使用する複雑なC++ソフトウェアを書き始めていますが、私の懸念事項は、これらのライブラリにアクセスするには限られた数のクラスにしたいが、C++ヘッダーヘッダーを含むオブジェクトもクラスの依存関係にアクセスする必要があります。これを取り巻く最も適切な方法は何ですか?C++でのAPI設計
答えて
制限付きライブラリのオブジェクトへのポインタまたは参照のみがライブラリのオブジェクトに保持されている場合、ヘッダー自体を含めるのではなく、ヘッダーで前方宣言できます。唯一の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
};
の代わりにこれを行うことができます。
"制限された"クラスのインスタンスを含めるか、継承する必要がある場合は、ヘッダーファイルにそのヘッダーを含めないでください。
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();
}
ちょうど私が思った考えの一つはヘッダ内に#ifdefを使用していて、一致する.cppファイルに#defineを置くことで、他のすべてのクラスは隠すことを試みているライブラリを使用したり表示することができません。後のアイデアは外部のライブラリからヘッダーの公開を制限することで、偶然コードがそれらと相互作用しないようにすることです –
- 1. C++ APIの設計とエラー処理
- 2. C++ APIの設計:パブリックインターフェイスをクリアする
- 3. アプリケーションモデルAPIの設計
- 4. RESTful APIの設計
- 5. C++でのマップの設計
- 6. C#でのクラス設計 - DAL
- 7. REST API設計クエリ
- 8. C++の設計パターン:
- 9. ビジネスロジックとRESTful APIの設計
- 10. REST APIの設計 - リクエストボディ
- 11. REST APIのセキュリティ設計
- 12. REST API、多言語設計
- 13. C#マルチスレッド設計の例
- 14. Cのビルダー設計パターン
- 15. C#Windowsフォームアプリケーションの設計
- 16. C++イテレータのパイプライン設計
- 17. JavaでバルクREST APIを設計する
- 18. C++での設計上の問題:インタフェース中心設計でのコード再利用
- 19. APIのモデルからのDTOの設計
- 20. RailsのRESTのAPIの設計
- 21. Web APIのURLの設計と実装
- 22. Node.js APIの設計とルートの処理
- 23. RESTFulで計算APIを設計する方法は?
- 24. REST APIの設計:リンクするリソース
- 25. ウェブAPIの設計:認証方法
- 26. WCFを使用したAPIの設計
- 27. RESTful APIエンドポイントフィルタと検索の設計
- 28. 非同期APIコールバック設計の質問
- 29. RESTful API URIの設計:階層
- 30. C++ GUIイベント/メッセージング設計
これは呼び出しです[不透明なポインタ](http://en.wikipedia.org/wiki/Opaque_pointer)を使って "ed" –