Справочная информация:
Идиома PIMPL (указатель на IMPLementation) - это метод скрытия реализации, при котором открытый класс обертывает структуру или класс, который нельзя увидеть за пределами библиотеки, частью которой является общедоступный класс.
Это скрывает детали внутренней реализации и данные от пользователя библиотеки.
При реализации этой идиомы, почему вы должны размещать общедоступные методы в классе pimpl, а не в общедоступном классе, поскольку реализации методов общедоступных классов будут скомпилированы в библиотеку, а у пользователя есть только файл заголовка?
Чтобы проиллюстрировать, этот код помещает реализацию Purr()
в класс impl и также обертывает его.
Почему бы не реализовать Purr непосредственно в общедоступном классе?
// 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");
}