Стандартная реализация идиомы 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?), Я не вижу, как вы можете сделать это, не экспортируя весь класс.
См. Раздел Использование dllimport и dllexport в классах C++
Тем не менее, вы можете столкнуться с проблемой "множественного CRT". Вы должны уточнить свое намерение, то есть:
Если вы намерены предоставить DLL, используемую в неизвестных различных контекстах (коммерческая DLL), вы должны использовать непрозрачный тип (вид HANDLE), используя API "create/delete", а не "публикацию" класса MyClass.