Как использовать идиому pImpl в публичном интерфейсе библиотеки DLL?

0

Стандартная реализация идиомы 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
    Почему бы вам просто не экспортировать весь MyClass?
Теги:
dll
pimpl-idiom

1 ответ

0

Если пользователю разрешено играть с экземплярами MyClass (что помешает ему помещать их в контейнер STL? Или использовать другие типы STL, такие как shared_ptr?), Я не вижу, как вы можете сделать это, не экспортируя весь класс.

См. Раздел Использование dllimport и dllexport в классах C++

Тем не менее, вы можете столкнуться с проблемой "множественного CRT". Вы должны уточнить свое намерение, то есть:

  1. какой пользователь/программа?
  2. зачем вам нужен подход "DLL и plimp"?

Если вы намерены предоставить DLL, используемую в неизвестных различных контекстах (коммерческая DLL), вы должны использовать непрозрачный тип (вид HANDLE), используя API "create/delete", а не "публикацию" класса MyClass.

  • 0
    pImpl не исключает помещения объектов в контейнеры STL и т. д. Существует конструктор копирования и оператор присваивания - этого должно быть достаточно. Проблема «множественного CRT» не появляется, потому что внутри библиотеки выполняется как построение, так и уничтожение. И мне это нужно, потому что мы создаем коммерческий DLL-продукт библиотеки.
  • 0
    Если вы разрешите EXE играть с экземплярами, то создание и уничтожение будут выполняться с помощью EXE / CRT версии new / delete.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню