如何重新设计c ++类?

时间:2015-08-05 16:02:48

标签: c++ dll dllexport

我有很多这样的课程:

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的抽象接口之外,还有什么可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

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

您可能希望遵循不同的路径。例如,您可以构建一个包含C ++类的 pure-C接口 API层,并从DLL中导出它。带有纯C接口的DLL就好了(例如,想想Win32 API) 然后,您可以分发一个头文件,其中此纯C接口包装在C ++类中,可供客户端使用(例如,考虑ATL / WTL,这是围绕纯C Win32 API的方便的C ++包装)。 / p>

或者您可以按照 COM-ish 方法导出C ++接口 您可以在本文中找到有关它的更多详细信息:

  

HowTo: Export C++ classes from a DLL

答案 1 :(得分:0)

DLL只提供对全局变量和函数的引用,因为类不使用,所以不能从DLL中导出类中的任何内容。通常,您可以将类放入头文件,并在DLL和线束可执行文件之间共享头文件,就像使用具有多个源文件的C ++项目一样。