Один из классов в моей программе использует какую-то стороннюю библиотеку. Объект библиотеки является частным членом моего класса:
// My.h
#include <3pheader.h>
class My
{
...
private:
3pObject m_object;
}
Проблема с этим - любой другой модуль в моей программе, который использует My class, должен быть настроен для включения заголовков 3p. Переход на другой тип 3p поставит под угрозу всю сборку ... Я вижу два способа исправить это: один - сделать 3pObject extern и превратить m_Object в указатель, инициализируемый в конструкторе; во-вторых, создать классы «интерфейса» и «фабрики» и экспортировать их ...
Не могли бы вы предложить другие способы решения этой проблемы?





Шаблон частной реализации (PIMPL):
http://www.codeproject.com/KB/tips/PIMPL.aspx
По сути, вы определяете, что ваш класс содержит указатель на структуру, которую вы объявляете вперед. Затем вы определяете структуру внутри файла cpp и используете конструктор и деструктор в своем классе для создания / удаления PIMPL.
:)
Используйте идиому «сутенер»:
// header
class My
{
class impl;
std::auto_ptr<impl> _impl;
};
// cpp
#include <3pheader.h>
class My::impl
{
3pObject _object;
};
Ничего особенного - я привык использовать auto_ptr - в этом случае, вероятно, более уместно использовать scoped_ptr, поскольку нет передачи права собственности
Вся внутренняя структура QT выполняется с использованием частных классов реализации. Вы можете найти в нем хорошую справочную информацию о том, как это делается правильно.
Есть ли причина не использовать boost :: scoped_ptr?