どういうわけかクラス(変数はクラスのタイプ名を持っています)をdllに送信しますか?クラスが定義されているファイル(.hファイル)をdllに含める必要がありますか?
いいえ、ライブラリを特定のアプリケーションタイプに依存させてはなりません。このライブラリを他のアプリケーションでどのように使用できるでしょうか。
ライブラリは、このライブラリで認識されているタイプのオブジェクトのみを受け入れるものとします。
したがって、アプリケーションには次のタイプがあります。
template <class T>
class Group;
そして、このタイプのオブジェクトを受け入れるライブラリ関数が必要です。
2つの典型的な解決策があります:
最初のソリューション、ObjectOrientedソリューションという名前を付け、ライブラリにインターフェイスを作成し、このインターフェイスを実装するオブジェクトを受け入れる関数を作成します。
class SomInterface {
public:
virtual void foo1() = 0;
virtual void foo2() = 0;
};
void doSomething(SomeInterface& object);
次にdoSomething
、アプリケーションで使用するには、いずれかのクラスがこのインターフェイスから派生する必要があります。
template <class T>
class Group : public SomeInteface {
public:
virtual void foo1() {...}
virtual void foo2() {...}
};
Group<UMesh> object;
doSomething(object);
または(私はこれが好きです)クラスからこのインターフェースへのアダプターを作成します:
template <class T>
class GroupSomeInterface : public SomeInteface {
public:
GroupSomeInterface(Group<UMesh& object) : object(object) {}
virtual void foo1() {...}
virtual void foo2() {...}
private:
Group<UMesh& object;
};
Group<UMesh> object;
GroupSomeInterface<UMesh> adapter(object);
doSomething(adapter);
2番目の解決策、それを一般的な解決策と名付けましょう。テンプレートクラスがあるので、この特定のケースに適しているはずです。ライブラリ内に、任意のタイプのインターフェイスを受け入れる関数テンプレートを作成します。
template <class T>
void doSomething(T& object);
Group<UMesh> object;
doSomething(object);
このメソッドに必要なインターフェイスがない場合Group<T>
は、最初のソリューションのようにアダプタを作成します。ただし、今回は明示的なインターフェイスクラスがなく、仮想化もありません。
template <class T>
class GroupSomeInterface {
public:
GroupSomeInterface(Group<UMesh& object) : object(object) {}
void foo1() {...}
void foo2() {...}
private:
Group<UMesh& object;
};
Group<UMesh> object;
GroupSomeInterface<UMesh> adapter(object);
doSomething(adapter);
ところで、オブジェクトインターフェイスとは、このオブジェクトで動作するすべてのパブリック関数とすべてのグローバル関数を意味します(operator << (ostream,Object)
たとえば)