나는 C++에서 pimpl를 사용하는 방법을 찾고 있었다, 나는 튜토리얼에이 코드 조각을 발견왜 우리는 pimpl에서 'new'를 사용합니까?
// In MyClass.h
class MyClassImp; // forward declaration of Pimpl
class MyClass
{
public:
MyClass();
~MyClass();
MyClass(const MyClass &rhs); // undefined for simplicity
MyClass& operator=(MyClass);
void Public_Method();
private:
MyClassImp *pimpl_; // the Pimpl
};
// In MyClass.cpp
#include "MyClass.h"
class MyClassImp
{
public:
void Private_Method() {} // dummy private function
int private_var_; // a private variable
};
MyClass::MyClass() : pimpl_(new MyClassImp())
{
}
MyClass::~MyClass()
{
delete pimpl_;
}
void MyClass::Public_Method()
{
pimpl_->Private_Method(); // do some private work
pimpl_->private_var_ = 3;
}
하지만 힙에 MyClassImp을 할당하는 이유 주위에 내 머리를 가져올 수 없습니다 스택에 변수를 사용할 수 없습니까? 우리는 분리 .H 및 .CPP 파일에 MyClassImp을 넣어에서 MyClass.h의 .H 포함 된 경우
및 MyClassImp의 pimpl_을 사용합니다 :
는 명확히하기 위해 (포인터없이) 동일한 결과를 얻지 못했습니까? MyClassImp의 구현이 변경되면 호출자 (MyClass)는 변경 및 재 조합 할 필요가 없습니다. (그들은 여전히 다시 링크해야합니다)
* 어느 스택? MyClass :: MyClass 중 하나입니까? 일단 생성자가 끝나면 파멸됩니다. 전화 한 사람? * 당신은 호출자를 모릅니다. * – DevSolar
당신은 왜 당신이'MyClassImp * pimpl_; '대신'MyClassImp pimpl_; '? – NathanOliver
"스택에서"주소를 지정하려면 - 함수 호출에서 원하는 스택 프레임 내에 있습니까? 또한 자동 저장 기간을 사용하지 않는 이유를 설명하기 위해 연습의 요점은 'MyClassImp'의 정의를 숨기는 것입니다. 직접적인 구성원이라면 그 크기 (따라서 정의)를 알아야 할 것입니다. – Angew