배경 설명 :"PIMPL"관용구를 사용해야하는 이유는 무엇입니까?
PIMPL Idiom (구현에 대한 포인터)가 공용 클래스 공용 클래스의 일부 라이브러리 밖에 볼 수없는 구조 또는 클래스를 감싸고있는 이행 은닉하는 기술이다.
이렇게하면 라이브러리 사용자의 내부 구현 세부 사항과 데이터가 숨겨집니다.
공용 클래스 메소드 구현이 라이브러리로 컴파일되고 사용자가 헤더 파일 만 갖기 때문에이 관용구를 구현할 때 왜 공용 메소드를 pimpl 클래스에 배치하겠습니까?
설명하기 위해이 코드는 Purr()
구현을 impl 클래스에 넣고 랩핑합니다.
Purr을 공용 클래스에서 직접 구현하지 않는 이유는 무엇입니까? impl-> 푸르르 내부의 CPP 파일에 대한 호출을 배치는
// 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");
}
왜냐하면 PIMP 관용구는 피해야하기 때문입니다 ... – mlvljr
우수 답변,이 링크에는 광범위한 정보가 포함되어 있습니다. http://marcmutz.wordpress.com/translated-articles/pimp-my-pimpl/ – zhanxw
If 당신은 호의 이후에 오는 유지 보수 코더를 원한다. 이것이 ** 인터페이스 ** 패턴이라는 것을 기억하라. 거기에있는 모든 내부 클래스에 사용하지 마십시오. 블레이드 러너의 말을 인용하면 사람들이 믿지 않을 것이라고 생각했습니다. – DevSolar