機能(ヘッダーファイル)に対するクラスインターフェイスを提供するAPIを構築し、すべての標準的な理由で実装を非表示にしたいと考えています。私は、オブジェクトファクトリを使用して、インタフェースに準拠した派生した「新しい」オブジェクトのオブジェクトポインタを返すことを計画しています。C++インターフェイスクラス、テンプレート、およびオブジェクトファクトリを使用したAPIの構築
コアAPIのクラスは、組み込み数値型(char、uchar、short、ushort、int、uint、float、double)のstd :: vectorsに基づいて異なります。テンプレートは自然にフィットするようです。私は、私のAPIのユーザーが利用できるインターフェイスクラステンプレートを作成し、それを隠す実装クラステンプレートで派生させます。
私のユーザーが見ることができるクラステンプレートはインターフェイスクラスなので、純粋な仮想メソッドを宣言したいと思っていますが、ここで必要なテンプレートインスタンス化/エクスポートをdllや共有オブジェクトなどで行うと問題が発生することがあります。それらを仮想的に定義して、基本インターフェースクラスに空のメソッド本体を与えます。どこかに沿って、派生クラスのオブジェクトを作成し、呼び出し側にポインタを返すテンプレート静的ファクトリメソッド(またはテンプレート関数)を作成する必要があります。
問題は、非表示にする派生クラスのオブジェクトを作成する必要があるため、静的オブジェクトファクトリメソッドの実装をインターフェイスヘッダーファイルに配置できません。だから私はこれらの静的オブジェクトファクトリを実装ヘッダーまたはソースファイルに入れたいと思います。ここ
ここ
#ifndef INTERFACE_H
#define INTERFACE_H
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
// This interface class is exported from the dll.
template < typename T >
class DLL_API InterfaceClass {
public:
static InterfaceClass* factoryMethod();
virtual ~InterfaceClass () { }
virtual void someMethod(T aParam){ };
protected:
InterfaceClass () { }
private:
InterfaceClass (const InterfaceClass &);
InterfaceClass& operator=(const InterfaceClass &);
};
#endif
は概念的派生実装クラス
#ifndef IMPLEMENTATION_H
#define IMPLEMENTATION_H
#include <vector>
#include "interface.h"
template < typename T >
class DerivedClass : public InterfaceClass<T> {
public:
DerivedClass(const T& aDataVector) : InterfaceClass<T>() { /*...*/ }
virtual ~DerivedClass() { /*...*/ }
virtual void someMethod(T aParam) { /*...*/ }
private:
std::vector<T> _dataVector;
}である概念的な実装ヘッダです。
注:実際には、生ポインタの代わりにTR1 :: shared_ptrを使用します。
私の質問は以下のとおりです。
1)どこで私は、静的な "factoryMethod()" メソッド(implementation.hまたはimplementation.cpp)を定義するのですか?
2)このメソッドの実装はどのように見えますか?
3)私または私のAPIユーザーがリンク時または実行時エラーを受け取らないように注意する必要がある他の問題はありますか?
ありがとうございます!
Visual Studio 2008の下で動作させました – intensifi