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

时间:2013-11-28 09:25:55

标签: c++ dll pimpl-idiom

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的最正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果允许用户玩MyClass实例,(什么会阻止他把它们放在STL容器中?或者使用其他STL类型如shared_ptr?)我看不出如何在不导出整个类。

请参阅Using dllimport and dllexport in C++ Classes

尽管如此,您可能遇到“多重CRT”问题。你应该澄清你的意图,即:

  1. 什么样的用户/程序?
  2. 为什么需要“DLL和plimp”方法?
  3. 如果您的目的是提供在未知的各种上下文中使用的DLL(商业DLL),您应该使用opaque类型(HANDLE类型),使用“创建/删除”API,而不是“发布”MyClass类。