Как сделать деструктор по умолчанию не встроенным? - PullRequest
0 голосов
/ 26 июня 2018

Как заставить компилятор сделать деструктор класса по умолчанию не встроенным?

Один из способов сделать это - написать пустое определение деструктора, но оно выглядит грязным, а также вы получаете предупреждение от статического анализатора ( clang-tidy в моем случае), что = default должно использоваться для тривиального деструктора.

Чтобы подробнее узнать о конкретном случае использования - цель состоит в том, чтобы иметь нечто похожее на:

MyClass.h

class MyClassImpl;

class MyClass {
    std::unique_ptr<MyClassImpl> m_impl;
public:
    MyClass();
    // and some other methods
};

A std::unique_pointer к неполному типу, который заранее объявлен в заголовке, а определение известно только в исходном файле.

Приведенный выше код выдаст ошибку компилятора:

error: use of undefined type 'MyClassImpl'

Фактическая проблема заключается в том, что деструктор по умолчанию MyClass, сгенерированный компилятором, является встроенным, и поэтому ему требуется полная информация о типе MyClassImpl.

Это можно исправить, добавив пустой деструктор для MyClass (путем объявления в заголовке и определения в исходном файле, поскольку определение в заголовке неявно сделает его встроенным, что приведет к той же ошибке).

Но разве это единственный путь в современном C ++?

1 Ответ

0 голосов
/ 26 июня 2018

Просто внедрите его в файл cpp обычным способом:

MyClass.h

class MyClassImpl;

class MyClass {
    std::unique_ptr<MyClassImpl> m_impl;
public:
    MyClass();
    ~MyClass() /*noexcept*/;

    // and some other methods
};

в кпп

MyClass::~MyClass() /*noexcept*/ = default;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...