Почему следует использовать идиому «PIMPL»? [Дубликат]

На этот вопрос уже есть ответ:

Используется ли на практике идиома pImpl? 11 ответов

Backgrounder:

The PIMPL Идиома (Указатель на IMPLementation) - это метод для сокрытия реализации, в котором публичный класс оборачивает структуру или класс, который нельзя увидеть вне библиотеки, частью которой является публичный класс.

Это скрывает внутренние детали реализации и данные от пользователя библиотеки.

При реализации этой идиомы зачем размещать открытые методы в классе pimpl, а не в публичном классе, поскольку реализации метода открытых классов будут скомпилированы в библиотеку, а у пользователя будет только заголовочный файл?

Чтобы проиллюстрировать, этот код ставитPurr() реализация класса impl и его обертка.

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

// header file:
class Cat {
    private:
        class CatImpl;  // Not defined here
        CatImpl *cat_;  // Handle

    public:
        Cat();            // Constructor
        ~Cat();           // Destructor
        // Other operations...
        Purr();
};


// CPP file:
#include "cat.h"

class Cat::CatImpl {
    Purr();
...     // The actual implementation can be anything
};

Cat::Cat() {
    cat_ = new CatImpl;
}

Cat::~Cat() {
    delete cat_;
}

Cat::Purr(){ cat_->Purr(); }
CatImpl::Purr(){
   printf("purrrrrr");
}

Ответы на вопрос(11)

Ваш ответ на вопрос