으로 당신이 참조 (D-참조)를 사용할 수 있습니다 here 언급 PIMPL 관용구의 경우 참조 사용의 단점 대신 PIMPL idiom의 경우 포인터 (D-포인터)의.장점과
이 구현에 심각한 문제가 있는지, 장단점이 무엇인지 이해하려고합니다.
장점 : 때문에의 사용
- 짧은 구문 "." "->"대신.
- ...
단점 :
- 새로운 ObjectPivate()이 실패하고 새로운이 포기하지 않는 어떤 경우 (예 : 새 (표준 :: nothrow) 또는 맞춤 새) nullptr을 대신 반환 하시겠습니까? 참조가 유효한지 확인하려면 추가 물건을 구현해야합니다. 포인터의 경우 그냥 사용 :
if (m_Private)
m_Private->Foo();
- 여러 생성자의 드문 경우 솔루션이 적용되지 수 복잡한 초기화 논리와 객체을 위해. [© JamesKanze]
- 메모리 관리를 위해 포인터를 사용하는 것이 더 자연 스럽습니다. [© JamesKanze]
- 일부 추가 구현 세부 사항은 예외 안전 (할당 연산자의 예 구현을) 보장 (스왑 (사용)) 고려 될 필요가있다 [© 매트 양]
- ... 여기
그림에 대한 샘플 코드 : 스타일의
// Header file
class ObjectPrivate;
class Object
{
public:
Object();
virtual ~Object();
virtual void Foo();
private:
ObjectPrivate& m_Private;
};
// Cpp file
class ObjectPrivate
{
public:
void Boo() { std::cout << "boo" << std::endl; }
};
Object::Object() :
m_Private(* new ObjectPrivate())
{
}
Object::~Object()
{
delete &m_Private;
}
void Object::Foo()
{
m_Private.Boo();
}
'new ObjectPivate()'가 실패하면'throw' 할 방법을 찾아야한다고 생각합니다. 구현이 덜컹 거리는 점은 없습니다. – juanchopanza
@juanchopanza 나는 그가 "실패한"의미하는 것이 확실하지 않습니다. 'new ObjectPrivate'는'operator new' (실패하면'bad_alloc'을 던집니다)와 생성자 (예외를 던지면서 만 실패를보고 할 수있는)를 호출합니다. –
@JamesKanze 오른쪽.나는 OP의 ** Cons ** 섹션을 다루었지만, 그 시나리오는'new (std :: nothrow) '에서만 가능할 것으로 생각합니다. – juanchopanza