他のいくつかのライブラリを使用する複雑な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. アプリケーションモデルAPIの設計
- 3. C++でのマップの設計
- 4. C#でのクラス設計 - DAL
- 5. C++の設計パターン:
- 6. RailsのRESTのAPIの設計
- 7. Node.js APIの設計とルートの処理
- 8. Web APIのURLの設計と実装
- 9. C#Windowsフォームアプリケーションの設計
- 10. C#マルチスレッド設計の例
- 11. Cのビルダー設計パターン
- 12. C++イテレータのパイプライン設計
- 13. WCFを使用したAPIの設計
- 14. REST APIの設計:リンクするリソース
- 15. 非同期APIコールバック設計の質問
- 16. ウェブAPIの設計:認証方法
- 17. C++での設計上の問題:インタフェース中心設計でのコード再利用
- 18. C++ライブラリを設計する
- 19. C++ GUIイベント/メッセージング設計
- 20. Rails認証APIを設計する
- 21. iPhone Objective-Cのforeachの設計
- 22. C++クラスの設計上の問題
- 23. C#アプリケーションで3DCart APIを設定する
- 24. これはPythonのAPI設計戦略ですか?
- 25. C#戦略パターン設計の問題
- 26. Objective-Cの契約による設計?
- 27. C++クラスの設計方法は?
- 28. スタティックライブラリ用マネージドDLL(C++/CLI)の設計
- 29. OO設計とデータベース設計
- 30. Cプログラム、チェックを設計する
これは呼び出しです[不透明なポインタ](http://en.wikipedia.org/wiki/Opaque_pointer)を使って "ed" –