如何在DLL库的公共接口中使用pImpl习语



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"问题。你应该澄清你的意图,即:

  1. 什么样的用户/程序
  2. 为什么需要"DLL和plimp"方法

如果您的意图是提供一个在未知的各种上下文中使用的DLL(商业DLL),您应该使用不透明类型(HANDLE类型),使用"创建/删除"API,而不是"发布"MyClass类。

最新更新