私有类函数与未命名名称中的函数

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

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

4个解决方案
18 votes

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

只需对此说不,并隐藏cpp文件中的私有内容即可。

如果我要重新开始大型C ++项目,则可以强制执行PIMPL Idiom:[http://c2.com/cgi/wiki?PimplIdiom]将更多私有详细信息移入cpp文件。

Just another metaprogrammer answered 2020-08-03T08:44:19Z
11 votes

我过去做过,而且总是结局很差。 您不能将类对象传递给函数,因为它们需要访问私有成员(大概是通过引用来访问)(否则最终会产生复杂的参数列表),因此无法调用公共类方法。 出于相同的原因,您不能调用虚拟函数。 我坚信(基于经验)这是一个坏主意。

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

answered 2020-08-03T08:44:44Z
5 votes

从根本上说,问题在于所讨论的函数作为类的一部分是否真的有意义。 如果您唯一的目的是将类的详细信息保留在标头之外,则可以考虑使用pimpl惯用语。

Jerry Coffin answered 2020-08-03T08:45:04Z
3 votes

我认为这是一个好习惯。 它通常还具有隐藏辅助结构和数据类型的好处,从而减少了重建的频率和大小。 如果事实证明这些功能在其他地方有用,则还可以使这些功能更容易拆分为另一个模块。

Peter Ruderman answered 2020-08-03T08:45:24Z
translate from https://stackoverflow.com:/questions/3471997/private-class-functions-vs-functions-in-unnamed-namespace