2010-12-14 231 views
3

为了在C++中实现插件模式,我使用了显式链接的共享库(使用dlopen加载共享库)。是否可以定义一个指向构造函数的函数指针?

是否可以定义一个函数指针指向共享库中定义的类的构造函数,或者我必须在共享库内定义工厂方法,它将从共享库实例化(并初始化)一个类的对象?当然,在我的主应用程序中,我将定义一个指向工厂方法的函数指针,并且该方法将返回我需要的类的实例。

干杯

+1

在Windows上,您可以使用__declspec(dllexport/dllimport)导出和导入构造函数(实际上是整个类)。值得检查你的编译器的编译器文档,看看它是否提供了类似的东西。 – Puppy 2010-12-14 12:41:32

+0

在Linux上,默认情况下所有内容都会导出,您可以链接到任何您想要的内容。但他正在使用显式链接(想想WinAPI中的LoadLibrary/GetProcAddress),并且坦白地说我不知道​​如何在这种情况下处理构造函数。这是一个很好的问题。 – 2010-12-14 12:58:07

回答

6

的问题的答案是否定的,你不能一个成员或函数指针定义的构造函数。

对于dlopen,您需要提供一个带c链接的函数并动态加载它,您可以使用它来创建对象,并且还需要另一个函数来删除对象。

更多关于它here

+0

一篇非常好的文章!我最喜欢的是它建议使用纯虚函数的基本接口。显然这是实现插件的最佳方式。 – 2010-12-14 13:02:04

1

你需要知道名字的获取与对dlsym指针时重整问题()。依靠某种特定的破坏方法并不是一个好主意,它们都太多样化。所以唯一合理的做法是将您的插件接口作为extern“C”{...}公开,并在构造函数中使用工厂函数包装器。

+0

我同意。这就是我使用它们的方式。谢谢 – 2010-12-14 13:39:24

相关问题