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最正确的方法是什么?
如果用户被允许玩MyClass实例,(什么会阻止他把它们放在STL容器中?或者使用其他STL类型,如shared_ptr?)我不知道如何在不导出整个类的情况下实现它。
请参阅在C++类中使用dllimport和dllexport
然而,您可能会遇到"多重CRT"问题。你应该澄清你的意图,即:
- 什么样的用户/程序
- 为什么需要"DLL和plimp"方法
如果您的意图是提供一个在未知的各种上下文中使用的DLL(商业DLL),您应该使用不透明类型(HANDLE类型),使用"创建/删除"API,而不是"发布"MyClass类。