我的大部分课程分为两个文件(.h和.cpp)。他们的所有方法(public,private或protected)都在.h文件中声明,并在.cpp文件中定义。
但是,有时我只需要一个仅由其中一个成员方法使用的快速辅助方法。在这些情况下,可以在.cpp文件中声明/定义此方法作为非成员函数而不在.h文件中声明它吗?
这种方法有哪些可能的缺点?我看到的是这个方法的定义必须在它在.cpp文件中使用之前(如果我们不想使用前向声明)。如果这些函数完全位于.cpp文件中,IDE也可能会遇到麻烦。
我问这个的原因是,有时候我几乎觉得我污染了.h文件,声明这些方法没有访问成员数据,也没有被任何其他类/文件使用。看起来我通过引入这些辅助方法声明来更难找到/读取.h文件中真正重要的声明。
答案 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函数用于方法中的琐碎任务来进行分组。