История изменений
Исправление zerhud, (текущая версия) :
хм, возмжоно не компилируется уже, раньше студийный компилятор это пропускал (это я еще на нем по работе сидел, где-нибудь год 15й 16й).
суть в том, что в деструкторе должен быть уничтожен pimpl, как в примере выше - объект класса Implementation. но у него есть только forward declaration, а вызывать delete для объекта только с forward declaration нельзя. поэтому я обычно делаю в таком духе. это в hpp файле
struct test_impl;
class test {
std::unique_ptr<test_impl> _pimpl;
test_impl& pimpl() { return *_pimpl; }
const test_impl& pimpl() const { return *_pimpl; }
public:
test();
~test() noexcept ;
};
test::test() : _pimpl(std::make_unique<test_impl>()) {}
test::~test() noexcept =default;
тут еще фиксится «баг» с константностью (я вроде писал тут выше). фиксится тем, что нельзя, кроме как при создании, обращаться напрямую к _pimpl.
Исходная версия zerhud, :
хм, возмжоно не компилируется уже, раньше студийный компилятор это пропускал (это я еще на нем по работе сидел, где-нибудь год 15й 16й).
суть в том, что в деструкторе должен быть уничтожен pimpl, как в примере выше - объект класса Implementation. но у него есть только forward declaration, а вызывать delete для объекта только с forward declaration нельзя. поэтому я обычно делаю в таком духе. это в hpp файле
struct test_impl;
class test {
std::unique_ptr<test_impl> _pimpl;
test_impl& pimpl() { return *_pimpl; }
const test_impl& pimpl() const { return *_pimpl; }
public:
test();
~test() noexcept ;
};
test::test() : _pimpl(std::make_unique<test_impl>()) {}
test::~test() noexcept =default;
тут еще фиксится «баг» с константностью (я вроде писал тут выше).