正如这里提到的,在PIMPL idiom的情况下,您可以使用引用 ( d-reference ) 而不是指针 ( d-pointer ) 。
我试图了解此实施是否存在任何严重问题以及利弊。
优点:
- 由于使用了“。”,因此语法更短。而不是“->”。
- ...
缺点:
- 如果new ObjectPivate()失败并且new没有抛出(例如:new(std::nothrow)或自定义new)并返回nullptr怎么办?您需要实施额外的东西来检查引用是否有效。如果是指针,您只需使用:
if (m_Private)
m_Private->Foo();
- 在具有复杂初始化逻辑的对象的多个构造函数的极少数情况下,该解决方案可能不适用。[©詹姆斯坎泽]
- 使用指针进行内存管理更自然。[©詹姆斯坎泽]
- 需要考虑一些额外的实现细节(使用swap())以确保异常安全(例如赋值运算符的实现)[© Matt Yang]
- ...
这里是用于说明的示例代码:
// 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();
}