c++ - 在 C++ 中使用非成员方法

标签 c++

我将我的大部分类(class)分成两个文件(.h 和 .cpp)。它们的所有方法(公共(public)、私有(private)或 protected )都在 .h 文件中声明并在 .cpp 文件中定义。

但是,有时我只需要一个仅由其中一个成员方法使用的快速辅助方法。在这些情况下,是否可以在 .cpp 文件中将此方法声明/定义为非成员函数而不在 .h 文件中声明它?

这种方法可能有哪些缺点?我看到的是这个方法的定义必须在它在 .cpp 文件中的使用之前出现(如果我们不想使用前向声明)。如果这些函数完全位于 .cpp 文件中,IDE 也可能难以找到它们。

我问这个问题的原因是,有时我几乎感觉我正在用这些不访问成员数据且不被任何其他类/文件使用的方法的声明污染 .h 文件。看起来我通过引入这些辅助方法声明使 .h 文件中真正重要的声明更难找到/阅读。

最佳答案

使用非成员函数是更好的解决方案。如果可以实现的话,有些人甚至更喜欢非成员函数而不是 public 成员函数。参见 Scott Meyer's article on the subject .

在很久以前,我曾经在文件范围内制作辅助函数 static 函数。

几年来,我在 .cpp 文件中使用匿名命名空间,并将函数和任何辅助类放在匿名命名空间中。

namespace
{
   // Helper class(es)
   struct Helper
   {
      ...
   };

   // Helper funtions
   type1 function1(...) { ... }

   type2 function2(...) { ... }
}

当我想在消息中使用辅助类的 type_info 时,匿名命名空间是个问题。为了克服这个问题,我采用了一种新方法。使用与 .cpp 文件对应的 namespace

foo.cpp:

namespace fooNS // Just append "NS" to the name of the cpp file
{
   // Helper class(es)
   struct Helper
   {
      ...
   };

   // Helper funtions
   type1 function1(...) { ... }

   type2 function2(...) { ... }
}

using namespace fooNS; // This allows the helper classes and functions
                       // to be used in the .cpp file without explicit use
                       // of the namespace.

到今天为止,我会推荐最后一种方法用于辅助类和辅助函数。

关于c++ - 在 C++ 中使用非成员方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34143403/

相关文章:

c++ - CORBA : how does client poll from server?

android - Android 上的 C++11 std::chrono::steady_clock 问题

c++ - 为什么头文件不能互相包含?

c++ - 无法在Lua中加载c dll模块

C++ 在给定的像素数据数组上绘制矩形

c++ - 我能做些什么来加速这段代码(字符串相似度)?

c# - 如何在 Windows 7 桌面上接受传入的蓝牙连接(使用 c++ 或 c# 程序)

c++ - 为什么将 lambda 用于非类型模板参数时 gcc 会失败?

c++ - 为什么 cout << 不能与重载的 * 运算符一起工作?

c++ - 虚函数数组