我正在使用 pimpl 习惯用法实现几个类,并且遇到了一些设计问题。
首先,我总是看到 pimpl 这样做
class Object
{
public:
Visible();
~Visible();
.. etc ..
private:
class ObjectImpl *_pimpl;
};
我有几个使用这种方法的类,我的问题是其中几个类需要访问彼此的实现细节,但是 _pimpl 指针是私有的。
任何人都可以看到将 _pimpl 公开的不利之处。显然,如果它是公开的,那么有人可能会意外(或故意)重新分配它。(我忽略了“私人”可以被#定义为“公共”并授予访问权限这一事实。如果你这样做,那么你应该得到你所得到的)。
我很欣赏我的设计可能存在缺陷,并且也欢迎任何关于这些方面的评论。
我真的很讨厌使用朋友,并且不确定他们是否会提供帮助,因为您无法在没有完全定义 Object 的情况下转发声明 Object::ObjectImpl。
IE
...
private:
class ObjectImpl *_pimpl;
friend class OtherObject::OtherObjectImpl; // this needs a fully qualified OtherObject
};
谢谢马克。
* 更新 - 更多细节 **
我有两个类,一个叫做命令,另一个叫做结果。我在 Command 上有返回结果向量的方法。
命令和结果都使用 pimpl 习惯用法。我希望结果的接口尽可能小。
class Command
{
public:
void getResults( std::vector< Results > & results );
void prepareResults( std::vector< Results > & results );
private:
class CommandImpl *_pimpl;
};
class Results
{
public:
class ResultsImpl;
Results( ResultsImpl * pimpl ) :
_pimpl( impl )
{
}
private
ResultsImpl *_pimpl;
};
现在在 Command::getResults() 中。我将 ResultsImpl 注入到结果中。在 Command::prepareResults() 中,我需要访问 ResultsImpl。
M。