实用函数的匿名命名空间

3
我的问题与在类中使用匿名命名空间组织代码有关。
早先,每当我需要某个实用工具方法执行一些内部计算时,我都会向类中添加一个私有方法,进行计算并使用结果。
现在,我不再将私有方法添加到类中,而是在类源代码中将相同的计算实现为匿名命名空间内的函数,传递所需数据并获取结果。这种做法是在阅读 这里 后开始实践的,该文章指出即使是类的私有方法也属于其接口,非成员函数可以改善类的封装性。
哪种方法更好?

4
主要是个人意见,但如果函数不必成为类的成员,只是实现细节,我选择在匿名命名空间中定义非成员函数。 - juanchopanza
你所指的是“未命名命名空间”,而不是“匿名命名空间”。 - Cody Gray
1个回答

1
在与客户端相关的头文件中,将概念上可能是私有成员函数的内容移动为关联实现文件中匿名命名空间中的非成员函数,这样做有很多好处,主要是因为客户端代码无需重新编译即可添加/更改/删除它们,同时也会提高类的封装性。然而,在头文件中的任何内联函数都无法看到/调用匿名命名空间的内容,并且没有通用的封装来防止实现文件翻译单元中后续的其他代码耦合到它。因此,该类变得更加封装化,但可能会对实现文件中的其余代码造成一定的影响,但这很少是一个重大的实际问题,因为那些采用指向该类类型对象的指针或引用的非成员函数不太容易被误用于无关目的,至少翻译单元相对于任意“客户端代码”提供了一个相对较小的范围。
话虽如此,上述权衡并不是Scott Meyer所链接文章的主要内容——它集中讨论在头文件中声明非成员非友元函数与公共成员函数之间的选择。显然,其中涉及到几个概念。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接