LINUX.ORG.RU

История изменений

Исправление 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 ;
};
и это в cpp
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 ;
};
и это в cpp
test::test() : _pimpl(std::make_unique<test_impl>()) {}
test::~test() noexcept =default;

тут еще фиксится «баг» с константностью (я вроде писал тут выше).