C++类"帮助函数"应该是免费的成员,免费或匿名吗?

rlb*_*ond 16 c++ function

所以,我有一堂课.这是一个有用的课程.我非常喜欢.我们称之为MyUsefulClass. MyUsefulClass有一个公共方法.我们称之为processUsefulData(std::vector<int>&).

现在假设processUsefulData真的做了两件事,我想从中重构它:

std::vector<int> MyUsefulClass::processUsefulData(std::vector<int>& data)
{
    for (/*...*/)
    {
        for (/*...*/)
        {
            // a bunch of statements...
        }
    }

    for (/*...*/)
    {
        for (/*...*/)
        {
            // a bunch of other statements...
        }
    }
    return data;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想分割这些职责并重写代码

std::vector<int> MyUsefulClass::processUsefulData(std::vector<int>& data)
{
    doProcessA(data, dataMember_);
    doProcessB(data, otherDataMember_);
    return data;
}
Run Code Online (Sandbox Code Playgroud)

所以,我不知道我是否应该让两个辅助函数自由函数或成员函数,并且每个函数都适合.我也不知道是否最好在匿名命名空间中创建它们.有谁知道这样做的好时机?

T.E*_*.D. 12

如果可能的话,我通常会在自治命名空间中创建辅助例程"自由"例程.这样我就不会让客户端不需要担心的接口复杂化(在*.h文件中关闭).

但是,您必须小心,不要通过这样做引入非重入.例如,通过修改全局数据对象或静态本地而不是类成员.如果你需要这样做,你最好把它变成一个合适的班级成员.


Dav*_*eas 9

自由功能/成员功能

我会让它们自由的功能是可能的(它们不需要访问类的内部).如果它们处理一组属性或需要访问其他成员,那么将其作为成员函数.

访问

如果代码只在此范围内有意义,并且不会从其他代码中使用,则将它们设为私有:如果是成员则为private;如果是自由函数,则在未命名的命名空间中实现.

如果其他代码将从使用代码中受益,则将其发布到界面中.这意味着如果它是成员或通过命名空间(或全局命名空间)中的标头可访问自由函数,则使其受到保护.