Заголовки C ++ - разделение между интерфейсом и деталями реализации - PullRequest
5 голосов
/ 15 октября 2008

Один из классов в моей программе использует стороннюю библиотеку. Объект библиотеки является приватным членом моего класса:

// My.h
    #include <3pheader.h>

    class My 
    {
    ...
    private:
       3pObject m_object;
    }

Проблема с этим - любой другой модуль в моей программе, который использует Мой класс, должен быть настроен на включение 3p заголовков. Переход на другой вид 3p поставит под угрозу всю сборку ... Я вижу два способа исправить это - один состоит в том, чтобы сделать 3pObject extern и превратить m_Object в указатель, инициализируемый в конструкторе; во-вторых, создать классы "interface" и "factory" и экспортировать их ...

Не могли бы вы предложить другие способы решения этой проблемы?

Ответы [ 3 ]

13 голосов
/ 15 октября 2008

Шаблон частного внедрения (PIMPL):

http://www.codeproject.com/KB/tips/PIMPL.aspx

По сути, вы определяете, что ваш класс содержит указатель на структуру, которую вы объявляете вперед. Затем вы определяете структуру внутри файла cpp и используете конструктор и деструктор в своем классе для создания / удаления PIMPL.

:)

11 голосов
/ 15 октября 2008

Используйте идиому "pimpl":

// header
class My
{
  class impl;
  std::auto_ptr<impl> _impl;
};

// cpp
#include <3pheader.h>
class My::impl
{
  3pObject _object;
};
0 голосов
/ 15 октября 2008

Вся внутренняя структура QT выполняется с использованием частных классов реализации.
Вы можете найти это для хорошего справочника о том, как это сделано правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...