C++ 在C+中使用非成员方法+;

C++ 在C+中使用非成员方法+;,c++,C++,我将我的大多数类分为两个文件(.h和.cpp)。它们的所有方法(public、private或protected)都在.h文件中声明,并在.cpp文件中定义 但是,有时我只需要一个仅由一个成员方法使用的快速助手方法。在这些情况下,可以在.cpp文件中将此方法声明/定义为非成员函数,而不在.h文件中声明它吗 这种方法可能有哪些缺点?我看到的一点是,这个方法的定义必须在.cpp文件中使用之前出现(如果我们不想使用前向声明)。此外,如果这些函数完全位于.cpp文件中,IDE可能很难找到它们 我问这个问

我将我的大多数类分为两个文件(.h和.cpp)。它们的所有方法(public、private或protected)都在.h文件中声明,并在.cpp文件中定义

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

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


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

您的思路确实正确。关于为什么应该选择非成员方法而不是成员方法的文章并不缺乏


最重要的好处之一是减少耦合。

使用非成员函数是更好的解决方案。如果可以实现的话,有些人甚至更喜欢非成员函数而不是
public
成员函数。看

在过去的日子里,我常常在文件范围内创建helper函数
static
函数

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

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

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

   type2 function2(...) { ... }
}
当我想在消息中使用helper类的
type\u info
时,匿名名称空间是一个问题。为了克服这一点,我采用了一种新方法。使用与
.cpp
文件相对应的
命名空间

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.

从今天起,我推荐最后一种方法用于帮助器类和帮助器函数。

只要这些帮助器函数声明不会与其他头文件中的名称产生名称冲突就可以了,但这不是您无法处理的

更好的方法是使用匿名名称空间,更好的方法是使用名称空间。通过这种方式,您可以更具体,做更多的事情,例如版本,甚至链接到特定的类:

namespace foo_helper{ foofun(){} }
class foo{ 
// calls foo_helper::foofun()
};

最后,您可以使用lambda函数对方法中的琐碎任务进行分组。

这很好,是个好主意,而且比拥有私有成员要好得多。只需将它们放在一个匿名名称空间中。您的IDE在您的cpp文件中查找独立函数的声明和定义时应该不会有任何问题。C的解决方案是在.cpp文件中使函数(非成员)保持静态:我这样做也可以。我将该函数放在cpp中实际使用它的成员函数的正上方。但是你关心的是丑陋的标题,你可以用接口类来解决。我喜欢你的答案。然而,将NS添加到名称空间的末尾听起来像是匈牙利符号的变体。你为什么这么做?我会让这个名称更具描述性,并称之为“namespace localFoo”(或者internalFoo)。但我实际上只是使用匿名名称空间。这是唯一保证唯一的名称空间名称。我个人更喜欢匿名名称空间,但当我使用实用程序函数命名名称空间时,我使用
detail
secret
。命名名称空间优于匿名名称空间的一个具体原因是,如果项目决定使用匿名名称空间来加快编译时间,后者很容易导致名称冲突。@KlitosKyriacou,使用
foo_detail
foo_private
也很好。我决定使用“NS”,可能是因为我只关心名称的唯一性,而不需要太多思考。