样式化非成员类相关的函数

时间:2016-04-22 14:18:36

标签: c++ class styling

在定义非成员类相关函数时,您是否应该在头文件或源文件中使用它们?这通常是最好的做法?或者这是个人偏好吗?

2 个答案:

答案 0 :(得分:0)

始终尽量减少可见度。如果您只需要在源文件中使用您的函数,则可以将其放入未命名的命名空间:

// Your .cpp
namespace 
{
    void yourHelperFunction( void ) // only visible in the translation unit
    { 
    ...
    }
}

// 我想发表评论,因为我目前正在回家的路上,但我需要更高的声誉......也许我稍后会改进我的答案。

答案 1 :(得分:0)

我通常会根据重用要求为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。 ......其他选项

辅助函数的其他选项包括静态类函数和复制/粘贴代码。上述每种策略都有其自身的优点和缺点,因此您需要为自己的代码库确定最佳方法。