C++/Использование идиомы pimpl совместно с умными указателями

Новичкам в C++ может быть не очевидно, почему не работает вот такой код:

#include <boost/scoped_ptr.hpp>

class TestPimpl;

class Test {
    public:
        Test();

    private:
        boost::scoped_ptr<TestPimpl> pimpl;
};

А причина в том, что компилятор сам создает деструктор, в котором потребуется вызов деструктора TestPimpl. Но TestPimpl в области видимости не присутствует, поэтому вызвать его деструктор не представляется возможным. Для решения проблемы следует указать пользовательский деструктор:

class TestPimpl;

class Test {
    public:
        Test();
        ~Test();

    private:
        boost::scoped_ptr<TestPimpl> pimpl;
};

и в .cpp файле:

class TestImpl {
...
}

Test::~Test()
{
}

Теперь TestImpl определен в области видимости и его деструктор может быть вызван.

Популярные страницы

C++/Оптимизация программ на языке C++

C++/Компиляторы

C++/Профайлеры

C++/Отладчики

Неблокируемые и асинхронные приложения

C++/Что предпочтительней: ссылка или указатель?

C++/Необычный код на C++

У вас есть полезные знания?

Тогда поделитесь ими с другими, добавив статью