PIMPL, POD, видимость класса реализации, будет ли вызван его деструктор? - PullRequest
0 голосов
/ 23 августа 2011

Википедия утверждает, что в статье о непрозрачных указателях , что

D-указатель является единственным закрытым элементом данных класса и указывает на экземпляр структуры (который должен быть POD, поскольку его деструктор невидим)

Это не требуется в PIMPL, и просто Википедия обычно уникальна, не так ли?

Я принимаю отсутствие тега d-указателя как ответ на мой вопрос, но надеюсь, что кто-то может внести свой вклад в Википедию и / или уточнить вещи. Или просто скажите, что Википедия ужасна, в крайнем случае и т.д .:)

Суть моего вопроса в том, насколько видимы методы вложенного класса, когда они полностью объявлены и определены в файле реализации cpp? Будет ли его деструктор вызван, как и ожидалось (содержащийся класс вызовет удаление в своем деструкторе)?

_ EDIT _ Фиксированная версия, http://en.wikipedia.org/wiki/Opaque_pointer

Ответы [ 2 ]

4 голосов
/ 23 августа 2011

PIMPL - отвратительная идиома, и я пришел к выводу, что это скорее анти-паттерн.

Однако, если вы настаиваете на его использовании, вы можете тривиально определить деструктор как пустой в файле реализации, чтобы в полной мере использовать любой умный указатель, который вы хотите использовать для автоматического уничтожения не-POD реализаций.

class Impl;
class Object {
    std::unique_ptr<Impl> impl;
public:
    //...
    ~Object();
};

#include "Impl.h"
// in cpp
Object::~Object() {}

Этот быстрый пример кода четко определяет Википедию как совершенно неверную - более чем возможно просто определить деструктор в файле реализации, чтобы использовать любой деструктор, который вы хотите, даже умные указатели, которые требуют полного определения.

3 голосов
/ 23 августа 2011

Да, это совершенно неправильно.Деструктор структуры PIMPL должен быть видимым в той точке, где он вызывается, то есть из определения деструктора самого класса.Поместите оба деструктора в один и тот же файл .cpp, в первую очередь dtor PIMPL, и видимость гарантируется.

Нет причин для того, чтобы dtor PIMPL был виден в любой другой точке, поскольку он там не вызывается.

...