【发布时间】:2011-04-07 08:57:42
【问题描述】:
在这个问题中,我问过"pimpl: shared_ptr or unique_ptr",我一直坚信pimpl 成语的正确用法是使用unique_ptr,而不是shared_ptr。它应该对用户起作用,就好像根本没有指针一样,而很明显shared_ptr 在复制时引入了别名,这绝对就像一个指针。
因此,假设用户想要为我的 pimpl 对象创建一个shared_ptr(假设他们实际上想要多个别名)。例如:
shared_ptr<my_pimpl> p(new my_pimpl());
这将导致 shared_ptr 指向 unique_ptr 指向我的实现。
如果我能实现以下目标,那就太好了:
my_pimpl x; // (1)
shared_ptr<my_pimpl> p(new my_pimpl()); // (2) Pointer to pointer here.
x.f(); // (3)
p->f(); // (4)
但是以某种方式摆脱了指向指针的指针,同时仍然保持 pimpl 的实现隐藏。
任何想法如何实现这一点(我很高兴更改第 (2) 行,显然是 my_pimpl,但希望第 (3) 和 (4) 行保持不变)。
【问题讨论】:
-
'my_pimpl' 是公共类还是私有类?
-
其实没关系。如果第 3 行有效,则第 4 行也有效,假设“shared_ptr”具有预期的语义。即使 'my_pimpl' 是 'unique_ptr
' 的 typedef,'operator->' 也会很好地“深入”到底层类型。
标签: c++ c++11 shared-ptr pimpl-idiom unique-ptr