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

时间:2009-07-17 20:22:01

标签: c++ function

所以,我有一堂课。这是一个有用的课程。我非常喜欢。我们称之为MyUsefulClassMyUsefulClass有一个公共方法。我们称之为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;
}

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

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

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

7 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:7)

免费功能/会员功能

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

使用

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

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

答案 2 :(得分:3)

我通常会将它们设为protectedprivate成员函数。这取决于你是否计划派生类并重写函数。

如果它们是常用的函数,它们在其他类中使用,则将它们移动到公共类中包含的静态函数或类所使用的单独对象。

答案 3 :(得分:2)

总是喜欢免费功能而不是会员功能。 请参阅我的回答here以了解原因。

答案 4 :(得分:2)

你提到自由函数这一事实让我相信“一堆其他语句”不需要访问类数据。如果是这样,让他们自由。这降低了类头的复杂性,而且标准算法中的自由函数更容易使用(也许std :: for_each,因为你还在使用向量?)。

答案 5 :(得分:0)

考虑范围。这些功能是否将用于其他课程或其他地方?他们应该公开呼吁吗?

看起来他们应该是我的私人会员功能,但这一切都取决于你的整体范围结构。

答案 6 :(得分:0)

如果原始函数作为成员函数有意义,

成员函数肯定。

私有/受保护的IMHO取决于它们的功能如何使用:如果仍然需要原始函数的操作,并且重构只是为了使代码更清晰,那么使它们受保护或私有,并从常规函数调用它们。你得到了重构,但保持了类的公共接口完整。