【问题标题】:How to redesign c++ classes?如何重新设计 C++ 类?
【发布时间】:2015-08-05 16:02:48
【问题描述】:

我有很多这样的课程:

class A 
{
public:
   std::string s;
   std::vector<int> v;
   int a;
}

我正在尝试导出以在 dll 中使用。我希望客户能够像这样使用该类:

A a;
a.s = "abc";
b.v.push_back(4);

但是因为向量和字符串不能导出,所以这是不可能的。除了为每个成员提供 getter 和 setter 并使用具有这些 getter 和 setter 的抽象接口之外,还有什么办法解决这个问题吗?

【问题讨论】:

  • 在重新设计某些东西时,尝试实际提出一个合理的设计。一堆公共数据成员,无论是裸露的还是用 getter/setter 装饰的,都不是。如果您正在尝试解决假定的 MSVC 无法导出字符串 which isn't really that bad 的问题,请将其称为解决方法,而不是重新设计,但事实并非如此。无论如何,如果您认为您不应该导出字符串数据成员,那么出于同样的原因,您不应该能够导出字符串 getter。

标签: c++ dll dllexport


【解决方案1】:

在 DLL 接口处具有 STL 类是一个非常脆弱的设计:如果这样做,则 DLL 的所有客户端都必须使用 相同版本的 Visual C++ 编译器构建,并且 相同的设置(例如相同的_ITERATOR_DEBUG_LEVEL 等),以及与 CRT 相同的风格
这是高度约束

您可能希望遵循不同的路径。例如,您可以构建一个包装您的 C++ 类的 纯 C 接口 API 层,然后从 DLL 中导出它。具有纯 C 接口的 DLL 就可以了(例如,想想 Win32 API)。
然后,您可以分发一个头文件,其中这个纯 C 接口被包装在 C++ 类中,以供客户端使用(例如,考虑 ATL/WTL,它们是纯 C Win32 API 的便捷 C++ 包装器)。

或者您可以采用 COM-ish 方法,导出 C++ 接口。
您可以在本文中找到更多详细信息:

HowTo: Export C++ classes from a DLL

【讨论】:

  • “在 DLL 接口上拥有 STL 类是一个非常脆弱的设计”。似乎只有在微软的世界里。
【解决方案2】:

DLL 仅提供对全局变量和函数的引用,因为您的类两者都不使用,因此您无法从 DLL 中导出任何内容。通常,您会将您的类放入一个头文件中,并在您的 DLL 和工具可执行文件之间共享该头文件,就像您对具有多个源文件的 C++ 项目所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2023-04-01
    • 2011-03-05
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多