在定义非成员类相关函数时,您是否应该在头文件或源文件中使用它们?这通常是最好的做法?或者这是个人偏好吗?
答案 0 :(得分:0)
始终尽量减少可见度。如果您只需要在源文件中使用您的函数,则可以将其放入未命名的命名空间:
// Your .cpp
namespace
{
void yourHelperFunction( void ) // only visible in the translation unit
{
...
}
}
// 我想发表评论,因为我目前正在回家的路上,但我需要更高的声誉......也许我稍后会改进我的答案。
答案 1 :(得分:0)
我通常会根据重用要求为C ++中的辅助函数选择四种策略之一。
如果这是一个仅在单个.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;
}
}
这允许重用辅助函数,但避免任何潜在的命名冲突。
<强>优点强>
<强>缺点强>
如果辅助函数需要访问您的内部类状态,请将其设为私有方法。
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;
}
}
<强>优点强>
<强>缺点强>
如果帮助函数可能在代码库中的多个位置使用,请将其解压缩到它自己的命名空间中的自己的文件中:
HelperFunction.h
namespace ProjectHelpers
{
/**
* \brief Do helpful thing.
*
* \return a helpful integer.
*/
int myHelperFunc();
}
<强>优点强>
<强>缺点强>
如果辅助函数非常小,并且使用仅限于单个函数,则可以创建lambda函数并像使用C ++算法函数的任何其他函数一样使用它(例如std::for_each()
)。
<强>优点强>
<强>缺点强>
辅助函数的其他选项包括静态类函数和复制/粘贴代码。上述每种策略都有其自身的优点和缺点,因此您需要为自己的代码库确定最佳方法。