2016-11-17 15 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的完美。但是我不能使用MinGW編譯DLL,因爲錯誤「未定義引用ObjectModel :: Get()」。是否有可能以這種方式構建DLL?

+1

否。如果您在另一個庫中實現了'ObjectModel :: Get()',則需要鏈接該庫。 –

+0

@ n.m。我知道這是脫離主題,但也許你知道另一種獲得相同功能的方法。 – flipback

+1

在您的DLL中有一個'init'函數,您明確地傳遞它需要的所有功能,但無法鏈接。在你的情況下,它看起來像你需要某種ObjectModel工廠。查看工廠模式。在主程序中創建一個工廠,並根據需要將其傳遞給模塊。 –

回答

0

通過@納米的評論來看工作:

否。如果您在另一個庫中實現了ObjectModel :: Get(),則需要鏈接該庫。

答案是否定的。

0

我認爲你需要使用ExObjectModel ::獲得(),而不是ObjectModel ::獲取(),因爲靜態函數不能像虛函數

+0

在這種情況下,我不能在DLL中使用ExObjectMode,因爲它調用ObjectModel :: Get() – flipback

相關問題