2016-11-17 33 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