вопрос по дизайну
в с++ лучший способ скрыть дебри реализации это ничего не экспортировать и не линковать, а предоставить тока абстрактные интерфейсы наружу
а можно както тоже самое сделать но с линковкой? причем не через жо а красиво?
на одном проекте пробую избавиться в модуле от интерфейсов(напрягает по 3 файла на один класс и на каждый пук менять метод в 3х местах)
да и не нравится что я не могу наследовать ничего при таком подходе, а какойто полезной изоляции такой подход не даёт, кроме того что можно независимо компилировать
но при таком подхоже тот к кому линкует хочет видеть все внешние инклуды линкуемого, что не прикольно, да и линковкой могут быть подобные проблемы
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Kingofastellarwar, Вы писали:
K>на одном проекте пробую избавиться в модуле от интерфейсов(напрягает по 3 файла на один класс и на каждый пук менять метод в 3х местах)
1)Какой смысл использовать unique_ptr для pimpl? Только чтоб не звать в деструкторе delete? EP>class Widget EP>{ EP> struct implementation; EP> unique_ptr<implementation> impl;
2)Зачем тут писать default? EP>Widget::~Widget() = default;
T>1)Какой смысл использовать unique_ptr для pimpl? Только чтоб не звать в деструкторе delete?
Ты так говоришь, как будто это сама по себе не достаточная причина.
T>2)Зачем тут писать default? EP>>Widget::~Widget() = default;
Чтобы unique_ptr<T> смог разрушить объект, T должен быть complete типом. Если не написать явно деструктор, то компилятор сгенерирует свой автоматически, но в нём тип T будет incomplete (очевидно, что из заголовочного файла не видно внутренностей implementation, и implementation таким образом не будет полностью определённым).
Существенно тут то, что декструктор реализован в точке в которой известны внутренности implementation.
Или вопрос в том, почему написано Widget::~Widget() = default; вместо Widget::~Widget() {} ? Ну это просто такой способ чуть яснее показать семантику, что тут важно именно место реализации, а сам деструктор подойдёт и созданных компилятором (по аналогии с default реализациями операций перемещения или копирования).
Здравствуйте, Tasheehoo, Вы писали:
T>Позвольте два оффтопных вопроса. T>1)Какой смысл использовать unique_ptr для pimpl? Только чтоб не звать в деструкторе delete?
Здравствуйте, watchmaker, Вы писали: W>Чтобы unique_ptr<T> смог разрушить объект, T должен быть complete типом. Если не написать явно деструктор, то компилятор сгенерирует свой автоматически, но в нём тип T будет incomplete (очевидно, что из заголовочного файла не видно внутренностей implementation, и implementation таким образом не будет полностью определённым). W>Существенно тут то, что декструктор реализован в точке в которой известны внутренности implementation.
Как-то не задумывался об этом... Но логично.
W>Или вопрос в том, почему написано Widget::~Widget() = default; вместо Widget::~Widget() {} ? Ну это просто такой способ чуть яснее показать семантику, что тут важно именно место реализации, а сам деструктор подойдёт и созданных компилятором (по аналогии с default реализациями операций перемещения или копирования).
Да, вопрос был именно в этом.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Rule of three не выполнено — получаем вполне закономерные фейерверки и утечки:
Это и понятно. Я же могу перегрузить нужный конструктор и operator=.
Я правильно понимаю, что для случая когда объект не копируемый, использование обычного указателя на реализацию вполне достаточно?
Здравствуйте, Tasheehoo, Вы писали:
EP>>Rule of three не выполнено — получаем вполне закономерные фейерверки и утечки: T>Это и понятно. Я же могу перегрузить нужный конструктор и operator=.
Ну так сделай полный эквивалент, без double free и leaks, и сравни side-by-side оба варианта.
T>Я правильно понимаю, что для случая когда объект не копируемый, использование обычного указателя на реализацию вполне достаточно?
Внутри unique_ptr никакой магии — конечно всё можно вручную каждый раз расписывать. Но зачем?