能否定义一个指向构造函数的函数指针?

3
我正在使用显式链接的共享库(使用dlopen加载共享库)来实现C ++中的插件模式。
是否可以定义指向在共享库中定义的类的构造函数的函数指针,还是必须在共享库内定义工厂方法,以实例化(和初始化)共享库中的类的对象?当然,在我的主应用程序中,我将定义指向工厂方法的函数指针,该方法将返回我需要的类的实例。
干杯

1
在Windows上,您可以使用__declspec(dllexport/dllimport)来导出和导入构造函数(以及整个类)。值得检查您的编译器的编译器文档,看看它是否提供类似的功能。 - Puppy
在Linux上,默认情况下所有内容都是可导出的,您可以链接到任何想要的内容。但是他正在使用显式链接(类似于WinAPI中的LoadLibrary / GetProcAddress),老实说我不知道如何处理这种情况下的构造函数。这是一个好问题。 - Sergei Tachenov
2个回答

6

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

对于dlopen,你需要提供一个带有C语言链接的函数并动态加载它,你可以使用它来创建对象,同时你还需要另一个函数来删除对象。

更多信息请参考这里


一篇非常好的文章!我最喜欢的是它建议使用带有纯虚函数的基接口。显然,这是实现插件的最佳方式。 - Sergei Tachenov

1

当使用dlsym()获取指针时,您需要注意名称混淆问题。依赖于某些特定的混淆方法并不是一个好主意,因为它们都太过多样化。因此,唯一合理的做法是将插件接口公开为extern "C"{...},并使用构造函数包装器来进行工厂函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接