gpt4 book ai didi

c++ - Pimpl 习语和没有友元声明的内部对象协作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:15 26 4
gpt4 key购买 nike

我正在使用 pimpl 惯用法实现几个类,并且遇到了一些设计问题。

首先,我一直看到pimpl是这样做的

class Object
{
public:
Visible();
~Visible();
.. etc ..
private:
class ObjectImpl *_pimpl;
};

我有几个使用这种方法的类,我的问题是其中几个类需要访问彼此的实现细节,但 _pimpl 指针是私有(private)的。

谁能看到将 _pimpl 公开的缺点。显然,如果它是公开的,那么有人可能会不小心(或故意)重新分配它。 (我忽略了一个事实,即“私有(private)”可以#defined 为“公共(public)”并授予访问权限。如果您这样做,那么您应得的)。

我很清楚我的设计可能存在缺陷,并且也欢迎任何关于这些方面的评论。

我真的很讨厌使用 friend ,我不确定他们是否会提供帮助,因为你不能在没有完全定义 Object 的情况下转发声明 Object::ObjectImpl。

 ...
private:
class ObjectImpl *_pimpl;
friend class OtherObject::OtherObjectImpl; // this needs a fully qualified OtherObject
};

谢谢马克。

* 更新 - 更多细节 **

我有两个类,一个叫 Command,另一个叫 Results。我在 Command 上有返回结果 vector 的方法。

命令和结果都使用 pimpl 习惯用法。我希望 Results 的界面尽可能小。

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 注入(inject)到结果中。在 Command::prepareResults() 中,我需要访问 ResultsImpl。

M.

最佳答案

我怀疑是否有充分的理由将实现公开:您始终可以使用公共(public)方法公开实现的功能:

class Object
{
public:
Object();
~Object();

int GetImplementationDetail();

private:
std::unique_ptr< ObjectImpl > _pimpl;
};

int Object::GetImplementationDetail()
{
return pimpl->GetImplementationDetail();
}

除此之外,一个类应该只负责一件事,并且应该对其他类具有最低限度的依赖性;如果您认为其他类应该能够访问您对象的 pimpl,那么您的设计可能存在缺陷。

编辑 在作者的更新之后:虽然你的例子仍然相当模糊(或者至少我不能说出它的全部意图),但你似乎误解了这个成语,现在尝试应用它在没有用的情况下。正如其他人指出的那样,“P”代表私有(private)。您的结果类没有太多私有(private)实现,因为它们都是公开的。因此,要么尝试使用我上面提到的内容并且不要“注入(inject)”任何东西,要么一起摆脱 pimpl 并仅使用 Result 类。如果您的 Result 的类接口(interface)应该很小以至于它只是指向另一个类的指针,那么在这种情况下它似乎没有多大用处。

关于c++ - Pimpl 习语和没有友元声明的内部对象协作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com