我在头文件中有一堆函数(func1(),func2(),...),我想提供一些作用域。我知道2种实现方式:
class bunchOfFunctions
{
public:
static void func1();
static void func2();
...
};
namespace bunchOfFunctions
{
void func1();
void func2();
...
};
在这两个选项中,我都可以以相同的方式访问功能,例如通过bunchOfFunctions::func()
。我更喜欢使用命名空间方法(较少键入),但是我也在工作场所中看到了第一种实现方法。
哪个选项更好?还有其他选择吗?
答案 0 :(得分:3)
除StroryTeller突出显示的点之外,
传播:namespace
可以传播到多个文件中,其中Class
必须在单个位置定义。
可读性和可理解性:通常,开发人员对Class
是什么和namespace
是什么的固有理解。
答案 1 :(得分:2)
“更好”取决于您的定义。您在范围界定中寻找什么素质?这里没有一种适合所有答案的尺寸。但是,这两种方法都有一些特性:
bunchOfFunctions::func1()
利用这些功能。同时,名称空间允许您提取
一个带有using声明的函数
using bunchOfFunctions::func1;
并在大多数范围内使用不合格的产品。如果您希望,甚至可以使用using指令使名称空间的所有成员可用于非限定名称查找。类没有等效的机制。using BOF = bunchOfFunctions;
而别名空间是用
namespace BOF = bunchOfFunctions;
bunchOfFunctions::detail
。这四个不在我的头上。判断自己的需求。至于“还有其他选择吗?” ,这是当今您必须在C ++中对此类函数进行分组的仅有两种方法。在C ++ 20中,我们将有模块!这将为代码提供另一个层次的分组。
答案 2 :(得分:0)
除了上面给出的信息外,我还要补充一点,回到类和名称空间是什么的标准定义可以帮助做出这样的决定。
名称空间是一个声明性区域,它为其内部的标识符(类型,函数,变量等的名称)提供范围。命名空间用于将代码组织到逻辑组中,并防止发生名称冲突,尤其是当您的代码库包含多个库时。
在面向对象的编程中,类是用于创建对象,提供状态(成员变量)和行为实现(成员函数或方法)的初始值的可扩展程序代码模板。
虽然听起来可能很相似,但它们是很具体的。因此,如果您的函数是相关的,但不一定与同一个对象相关,那么我会认真考虑是否将它们放在类中。特别是如果将这些功能归为一类可能违反“单一责任原则”:https://en.wikipedia.org/wiki/Single_responsibility_principle