c++ - 将非成员非友元函数优先于成员函数

标签 c++

这个问题的标题取自 Scott Meyers 在 Effective C++ 3rd Edition 中第 23 项的标题。他使用以下代码:

class WebBrowser {
public:
    void clearCache();
    void clearHistory();
    void removeCookies();

    //This is the function in question.
    void clearEverything();
};

//Alternative non-member implementation of clearEverything() member function.
void clearBrowser(WebBrowser& wb) {
    wb.clearCache();
    wb.clearHistory();
    wb.removeCookies();
};

虽然声明下面的替代非成员非友元函数比成员函数 clearEverything() 更适合封装。我想部分想法是,如果提供访问的成员函数较少,则访问 WebBrowser 的内部成员数据的方法也较少。

如果你接受这一点并制作这种外部非友元函数,你会把它们放在哪里?这些函数仍然与类紧密耦合,但它们将不再是类的一部分。将它们放在类(class)的同一个 CPP 文件、库中的另一个文件或其他文件中是好习惯吗?

我主要来自 C# 背景,我从来没有摆脱过对所有东西都成为类一部分的渴望,所以这让我有点困惑(虽然这听起来很愚蠢)。

最佳答案

通常,您会将它们放在关联的命名空间中。这与 C# 中的扩展方法具有(某种程度上)相同的功能。

问题是,在 C# 中,如果你想创建一些静态函数,它们必须在一个类中,这很荒谬,因为根本没有 OO 进行 - 例如,Math 类。在 C++ 中,您可以只使用正确的工具来完成这项工作——命名空间。

关于c++ - 将非成员非友元函数优先于成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507026/

相关文章:

android - Qt 不检测 Android NDK

c++ - 添加到 std::map 的元素是否会自动初始化?

c++ - 如何用实际值替换转义符号?

c++ - 使用花括号初始化 std::vector 使用初始值设定项列表

c++ - 在 Objective C++ 中使用 C++?

c++ - 将多维数组随机化(洗牌)到​​另一个二维数组中

c++ - 作为 OpenMP pragma 的结果的中间代码

c++ - 转换多个迭代器元素

c++ - 使用 std::equal 和相等运算符的比较

c++ - 调试 DirectX 11 程序时缺少 DLL (d3dx11d_43.dll)