2016-11-17 13 views
1

プロジェクトを動的ライブラリとクライアントコードに分割しました。C++のクライアント側でDLLで宣言されたメソッドを実装する方法

私はクラスObjectModelを持っています。

object_model.h:

class ObjectModel { 
    public: 
     virtual ~ObjectModel(); 
     static ObjectModel& Get(); 

     /* Some other methods */ 
    protected: 
     ObjectModel(); 
     ObjectModel(const ObjectModel&); 
     ObjectModel& operator=(ObjectModel&); 
}; 

私は図書館で、クライアントコードでメソッドObjectModel::Get()を使用します。私は拡張オブジェクトを取得し、別のプロジェクトのライブラリで使用する必要があるので、ライブラリにメソッドを実装していません。クライアント側では

#include <object_model.h> 

class ExObjectModel : public ObjectModel { 
} 

ObjectModel& ObjectModel::Get() { 
    static ExObjectModel m; 
    return m; 
} 

int main() { 
    ObjectModel &m = ObjectModel::Get(); 
    /* ... */ 
} 

それは完全にLinux上で動作します。しかし、 "ObjectModel :: Get()"への未定義のエラーのため、MinGWを使ってDLLをコンパイルできません。そのような方法でDLLを構築することは可能ですか?

+1

いいえ 'ObjectModel :: Get()'が別のライブラリに実装されている場合は、そのライブラリにリンクする必要があります。 –

+0

@ n.m。私はそれが話題ではないことを理解していますが、多分あなたは同じ機能を得る別の方法を知っています。 – flipback

+1

あなたのDLLに 'init'関数を用意してください。ここで関数は必要だがリンクすることはできないすべての関数を明示的に渡します。あなたの場合は、何らかの種類のObjectModelファクトリが必要なようです。工場パターンを参照してください。メインプログラムにファクトリを作成し、必要に応じてモジュールに渡します。 –

答えて

0

を動作することはできませんので、私は、::あなたがExObjectModelを使用する必要があると思うゲット()の代わりにObjectModel ::ゲット():

いいえ。ObjectModel :: Get()を別のライブラリに実装している場合は、そのライブラリにリンクする必要があります。

答えはありません。

0

静的関数は、@ NMさんのコメントから判断すると、仮想関数のように

+0

この場合、ObjectModel :: Get()を呼び出すため、DLL内でExObjectModeを使用することはできません。 – flipback

関連する問題