我发现自己倾向于没有私有类函数。如果可能的话,私有类函数的所有候选者,而不是我放入未命名的命名空间并将所有必要的信息作为函数参数传递。我没有一个合理的解释为什么我要这样做,但至少在我看来它看起来更自然。因此,我需要在头文件中公开较少的内部细节。
你的意见是什么——这是正确的做法吗?
我发现自己倾向于没有私有类函数。如果可能的话,私有类函数的所有候选者,而不是我放入未命名的命名空间并将所有必要的信息作为函数参数传递。我没有一个合理的解释为什么我要这样做,但至少在我看来它看起来更自然。因此,我需要在头文件中公开较少的内部细节。
你的意见是什么——这是正确的做法吗?
在我通常工作的半大型项目(超过 200 万行代码)中,如果可以的话,我会禁止私有类函数。原因是私有类函数是私有的,但它在头文件中可见。这意味着,如果我以任何方式更改签名(或评论),有时我会获得完全重新编译的奖励,这需要花费几分钟(或几个小时,具体取决于项目)。
对此说不,并隐藏 cpp 文件中的私有内容。
如果我要重新开始一个大型 c++ 项目,我会强制 PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom将更多私人细节移动到 cpp 文件中。
我过去曾这样做过,但总是以糟糕的方式结束。您不能将类对象传递给函数,因为它们需要访问私有成员,可能是通过引用(或者您最终得到复杂的参数列表),因此您不能调用公共类方法。出于同样的原因,您不能调用虚函数。我坚信(根据经验)这是一个坏主意。
底线:这听起来像是在实现“模块”对类具有某些特殊访问权限的情况下可能可行的想法,但在 C++ 中并非如此。
它基本上归结为一个问题,即所讨论的函数作为类的一部分是否真的有意义。如果您的唯一意图是将类的详细信息保留在标题之外,我会考虑使用 pimpl 习惯用法。
我认为这是一个很好的做法。它通常还具有隐藏辅助结构和数据类型的好处,从而降低了重建的频率和大小。如果事实证明它们在其他地方有用,它还可以使这些功能更容易拆分到另一个模块中。