繁体   English   中英

C++ 类“辅助函数”应该是成员、自由的还是非命名空间自由的?

[英]should C++ class "helper functions" be members, free, or anon-namespace free?

所以,我有一个类。 这是一个有用的类。 我非常喜欢。 我们称它为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;
}

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

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

所以,我不知道我是否应该将这两个辅助函数设为自由函数或成员函数,以及何时合适。 我也不知道将它们放在匿名名称空间中是否更好。 有谁知道这样做的好时机吗?

如果可能的话,我通常在匿名命名空间中使辅助例程成为“免费”例程。 这样我就不会因为客户不需要担心的事情而使接口(在 *.h 文件中关闭)复杂化。

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

自由函数/成员函数

我会让它们成为可能的自由函数(它们不需要访问类的内部结构)。 如果他们处理一组属性或需要访问其他成员,则将其设为成员函数。

使用权

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

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

我通常将它们protectedprivate的成员函数。 这将取决于您是否计划派生类并覆盖函数。

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

总是喜欢免费功能而不是会员功能。 在这里查看我的答案以了解原因。

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

考虑范围。 这些功能是否将在另一个类或其他地方使用? 他们应该可以公开调用吗?

对我来说,它们似乎应该是私有成员函数,但这完全取决于您的整体范围结构。

如果原始函数作为成员函数有意义,那么当然是成员函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM