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

时间:2015-12-07 21:17:38

标签: c++

我的大部分课程分为两个文件(.h和.cpp)。他们的所有方法(public,private或protected)都在.h文件中声明,并在.cpp文件中定义。

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

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

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

3 个答案:

答案 0 :(得分:4)

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

在过去的几天里,我曾经在文件范围内创建辅助函数static函数。

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

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

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

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

当我想在消息中使用帮助器类的type_info时,匿名命名空间是个问题。为了克服这个问题,我采用了一种新方法。使用与namespace文件对应的.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.

截至今天,我建议使用辅助类和辅助函数的最后一个方法。

答案 1 :(得分:0)

你的确走在正确的轨道上。不缺少描述为什么人们应该选择非成员方法的文章。

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

答案 2 :(得分:0)

只要这些辅助函数声明不会与其他头文件中的名称产生名称冲突,这是可以的,但这不是你无法处理的事情。

更好的方法是使用匿名命名空间,更好的方法是使用命名空间。这样你就可以具体而且做得更多,例如版本甚至链接到特定的类:

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

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