pImpl习惯用法的标准实现将以下代码放在.h文件中:
class MyClassImpl;
class MyClass
{
public:
MyClass();
~MyClass();
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
private:
MyClassImpl* pImpl;
};
但是,这需要以.LIB文件(静态库)的形式将构造函数和析构函数提供给我的库的用户。但是,我想创建一个DLL库,不需要用户链接其他静态库。有一些这样的功能:
__declspec(dllexport)
void MyFunction(MyClass& object);
用户需要先创建对象,然后再将其传递给函数。因此,他需要访问构造函数和析构函数。
设计此类库的API的最正确方法是什么?
答案 0 :(得分:0)
如果允许用户玩MyClass实例,(什么会阻止他把它们放在STL容器中?或者使用其他STL类型如shared_ptr?)我看不出如何在不导出整个类。
请参阅Using dllimport and dllexport in C++ Classes
尽管如此,您可能遇到“多重CRT”问题。你应该澄清你的意图,即:
如果您的目的是提供在未知的各种上下文中使用的DLL(商业DLL),您应该使用opaque类型(HANDLE类型),使用“创建/删除”API,而不是“发布”MyClass类。