2010-12-14 8 views
3

私は、C++でプラグインパターンを実装するために、明示的なリンク(共有ライブラリをロードするにはdlopen)で共有ライブラリを使用しています。コンストラクタへの関数ポインタを定義することは可能ですか?

共有ライブラリで定義されたクラスのコンストラクタへの関数ポインタを定義することは可能ですか?共有ライブラリからクラスのオブジェクトをインスタンス化(および初期化)するファクトリメソッドを共有ライブラリ内に定義する必要があります?もちろん私の主なアプリケーションでは、ファクトリメソッドへの関数ポインタを定義し、そのメソッドは必要なクラスのインスタンスを返します。質問へ

乾杯

+1

Windowsでは、__declspec(dllexport/dllimport)を使用してコンストラクタ(実際にはクラス全体)をエクスポートおよびインポートできます。あなたのコンパイラが何か類似しているかどうかを確認するコンパイラのドキュメントをチェックする価値があります。 – Puppy

+0

Linuxでは、デフォルトですべてがエクスポートされ、必要なものだけにリンクすることができます。しかし、彼は明示的なリンク(WinAPIでLoadLibrary/GetProcAddressを考えてください)を使用しています。正直なところ、このような場合にコンストラクタをどのように処理するかはわかりません。それは良い質問です。 –

答えて

6

答えはノーである、あなたは、コンストラクタにメンバーまたは関数ポインタを定義することはできません。

dlopenでは、cリンケージを持つ関数を用意し、動的にロードする必要があります。これを使用してオブジェクトを作成することができます。オブジェクトを削除するには別の関数も必要です。

それについて

もっとhere

+0

本当に良い記事です!私が一番好きだったのは、純粋な仮想関数を持つ基本インターフェースを使用することをお勧めします。明らかに、プラグインを実装する最良の方法です。 –

1

あなたは)(dlsymをしてポインタを取得する際に名前マングルの問題に注意する必要があると思います。特定のマングリング方法に頼るのは良い考えではありません。だから唯一合理的なのは、プラグインインタフェースをextern "C" {...}として公開し、コンストラクタ上のファクトリ関数ラッパーを使用することです。

+0

私は同意します。それが私が使っている方法です。ありがとう –

関連する問題