【发布时间】:2016-04-19 10:32:17
【问题描述】:
我承认这个问题听起来很笼统。但毕竟,从 DLL 导出类是一个普遍而困难的话题,坦率地说,我目前在相当普遍的层面上感到困惑。
简短的问题:C++ 和 DLL 中的面向对象编程如何结合在一起?
长问题:阅读this 和this 后,我有点失望和困惑,因为我想知道如果DLL 边界不允许对象,那么面向对象编程如何与DLL 一起工作共享(假设两个 DLL 使用了不同的编译器或编译器版本)。导出类的唯一选项是这些(如here 或here 所述):
- 导出创建和删除方法(C 风格,悬空指针的危险,没有对象作为参数,丑陋)
- 导出一个纯虚类和一个工厂函数,该函数创建从纯虚类派生的实际实现类的实例(需要继承,需要注意对象删除)
例如,我想将通用实用程序类放在一个 DLL 中,然后在其他 DLL 中的多个类中使用这些类,这些类本身也用于其他 DLL。我怎样才能做到这一点?这是组织课程的不明确方式吗?
额外问题:如果我导出一个具有实现指针的类,这是否等同于导出一个纯虚类和一个工厂函数?还是导出的成员函数必须是虚拟的?
编辑:如果重要的话,我在 Windows 7 上使用 Visual Studio 2010。迁移旧版 Visual Studio 让我对这个问题很敏感。
【问题讨论】:
-
使用 DLL 是一个非常实用的解决方案,可以解决在进行小改动时必须等待很长时间才能编译和链接程序的问题。将它们用作一个库,任何编译器版本都应该可以使用任何编译设置轻松使用它们,嗯,不。二进制兼容性不是 C++ 功能,必须由您添加,并且您已经知道需要什么。
-
@Hans Passant:是否有替代 DLL 以可重用方式组织源代码的方法?标头实现可能吗?还有什么?