样式化非成员类相关函数
Posted
技术标签:
【中文标题】样式化非成员类相关函数【英文标题】:Styling non member class related functions 【发布时间】:2016-04-22 14:18:35 【问题描述】:在定义非成员类相关函数时,通常应该将它们放在头文件还是源文件中?通常哪个是最佳实践?还是个人喜好?
【问题讨论】:
【参考方案1】:始终尽量减少可见度。如果您只需要在源文件中使用您的函数,您可以将其放入未命名的命名空间中:
// Your .cpp
namespace
void yourHelperFunction( void ) // only visible in the translation unit
...
// 我想发表评论,因为我目前正在回家的路上,但我需要更高的声誉......也许我稍后会完善我的答案。
【讨论】:
【参考方案2】:根据重用需求,我通常选择 C++ 中辅助函数的四种策略之一。
1。函数很大吗,只在一个源文件中使用?
如果这是一个仅在单个 .cpp 文件中需要的函数,并且将在多个地方使用,请将其放入 .ccp 文件顶部的匿名命名空间中:
namespace
int myHelperFunc()
int result = 0;
....
return result;
...
bool MyClass::someMethod()
return 0 != myHelperFunc();
void MyClass::someOtherMethod()
if (0 == myHelperFunc())
for (int i = 0; i < 10; ++i)
std::cout << i << std::endl;
这允许重复使用辅助函数,但避免任何潜在的命名冲突。
优势
范围仅限于单个文件。 不会与其他同名文件中的其他辅助函数发生命名冲突。缺点
在源文件顶部放置大量辅助函数可能会污染具有有限范围的函数的文件。2。该函数是否需要访问类状态?
如果帮助函数需要访问您的内部类状态,请将其设为私有方法。
int MyClass::myStatefulHelperFunc()
int result = 0;
if (IsInitialized())
....
return result;
...
bool MyClass::someMethod()
return 0 != myStatefulHelperFunc();
void MyClass::someOtherMethod()
if (0 == myStatefulHelperFunc())
for (int i = 0; i < 10; ++i)
std::cout << i << std::endl;
优势
范围仅限于单个类。 访问类状态。 可以设为虚拟,允许派生类使用替代实现覆盖帮助器。缺点
必须在头文件中声明。3。该函数对多个源文件有用吗?
如果辅助函数可能在您的代码库中的多个位置使用,请将其解压缩到它自己的命名空间内的自己的文件中:
HelperFunction.h
namespace ProjectHelpers
/**
* \brief Do helpful thing.
*
* \return a helpful integer.
*/
int myHelperFunc();
优势
可从代码库中的任何位置轻松访问。缺点
跨多个类/翻译单元共享的大量辅助函数可能表明存在代码异味。4。辅助函数是否仅限于单个函数,并且非常小?
如果辅助函数非常小,并且仅限于使用单个函数,您可以创建一个 lambda 函数并像使用任何其他使用 C++ 算法函数的函数一样使用它(例如std::for_each()
)。
优势
范围仅限于单个函数。 可以通过分配给变量在函数内的多个位置使用。缺点
仅限 C++11 及更高版本。5。 ...其他选项
辅助函数的其他选项包括静态类函数和复制/粘贴代码。上述每种策略都有其自身的优点和缺点,因此由您决定适合您自己的代码库的最佳方法。
【讨论】:
以上是关于样式化非成员类相关函数的主要内容,如果未能解决你的问题,请参考以下文章