我应该选择私有成员函数还是未命名命名空间中的函数? [重复]

问题描述 投票:0回答:4

我发现自己倾向于没有私有类函数。如果可能的话,我会将所有私有类函数的候选者放入未命名的命名空间中,并将所有必要的信息作为函数参数传递。我没有一个合理的解释为什么我要这样做,但至少它对我来说看起来更自然。因此,我需要在头文件中公开较少的内部细节。

您的意见是什么 - 这是正确的做法吗?

c++ coding-style api-design member-functions unnamed-namespace
4个回答
24
投票

在我通常工作的半大型项目中(超过 200 万行代码),如果可以的话,我会禁止私有类函数。原因是私有类函数是私有的,但它在头文件中是可见的。这意味着,如果我以任何方式更改签名(或注释),有时我会得到完全重新编译的奖励,这需要几分钟(或几个小时,具体取决于项目)。

对此说不,并将私有内容隐藏在 cpp 文件中。

如果我要重新开始一个大型 C++ 项目,我会强制执行 PIMPL Idiom:http://c2.com/cgi/wiki?PimplIdiom 将更多私人详细信息移至 cpp 文件中。


11
投票

我过去也这么做过,但结果总是很糟糕。您无法将类对象传递给函数,因为它们需要访问私有成员,大概是通过引用(或者最终会得到复杂的参数列表),因此您无法调用公共类方法。出于同样的原因,你也不能调用虚函数。我坚信(根据经验)这是一个坏主意。

底线:这听起来像是一种在实现“模块”对类具有某种特殊访问权限的情况下可能有效的想法,但在 C++ 中情况并非如此。


7
投票

这基本上归结为一个问题:所讨论的函数作为类的一部分是否真的有意义。如果您的唯一目的是将类的详细信息保留在标头之外,我会考虑使用 pimpl 习惯用法。


3
投票

我认为这是一个很好的做法。它通常还具有隐藏辅助结构和数据类型的优点,从而减少了重建的频率和大小。如果发现这些功能在其他地方有用的话,它还可以使这些功能更容易拆分到另一个模块中。

© www.soinside.com 2019 - 2024. All rights reserved.