命名空间内的范围功能与课堂内的功能
Scoping functions within namespace versus within class
我在标头文件中有一堆功能(func1((,func2((,...(,我想给出一些范围。我知道2个实现:
-
class bunchOfFunctions { public: static void func1(); static void func2(); ... };
-
namespace bunchOfFunctions { void func1(); void func2(); ... };
在两个选项中,我都可以以相同的方式访问功能,即通过 bunchOfFunctions::func()
。我更喜欢名称空间方法(较小的键入(,但是我在工作场所也看到了第一个实现方法。
哪种选项更好?还有其他选项吗?
除了突出显示点,
spread:可以将namespace
扩展到多个文件中,其中必须在一个地方定义Class
。
可读性和可理解性:通常开发人员对Class
的固有理解以及namespace
是什么。
"更好"取决于您的定义。您在范围中寻找什么素质?这里没有一个尺寸适合所有答案。但这是两种方法的一些属性:
- 有必要符合函数名称的必要性。
在课堂上,您必须必须写bunchOfFunctions::func1()
利用这些功能。同时,命名空间允许您拉动使用使用声明的功能
并在大多数范围中使用它不合格。如果您希望,您甚至可以通过使用指令将所有名称空间的所有成员都可以无限制的名称查找。课程没有等效的机械师。using bunchOfFunctions::func1;
- 混音。
没有区别。别名一个班级写的
同时使用名称空间的同时using BOF = bunchOfFunctions;
namespace BOF = bunchOfFunctions;
- 隐私。
班级可以有私人成员。因此,您可以将功能声明放在私人访问说明符下,并在公共内联成员中使用它们。名称空间没有这种机制。取而代之的是,我们依靠约定,并将声明放在"不要触摸此"内部名称空间下,通常称为bunchOfFunctions::detail
。 - 参数依赖查找。
C 具有一种机制,可以通过检查呼叫中包含 grimuments 的名称空间来从不合格的调用中找到函数声明。为此,该功能必须在实际的名称空间中。课堂的静态成员不受这样的查找。因此,对于任何成员类型
这四个是我头顶的。判断自己的需求。至于"还有其他选项吗?" ,这是您今天将此类功能分组为C 的唯一两种方法。在C 20中,我们将有模块!这将为代码提供另一个级别的分组。
此外,我还要补充一点,回到类的标准定义以及名称空间的内容可以帮助做出这样的决策。
名称空间是一个声明的区域,为标识符(类型,函数,变量等(提供了范围。名称空间用于将代码组织成逻辑组,并防止可能发生的名称碰撞,尤其是当您的代码库包括多个库时。
在面向对象的编程中,类是用于创建对象的可扩展程序编码模板,为状态(成员变量(提供初始值和行为的实现(成员函数或方法(。
虽然听起来可能相似,但它们是相当具体的。因此,如果您的功能是相关的,但不一定与同一对象相关,我会为是否将其放入课堂上而感到困难。特别是如果将这些功能组合在一起一堂课可能会违反单个责任原则:https://en.wikipedia.org/wiki/single_responsibility_principle_principle
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 命名空间内的范围功能与课堂内的功能
- 在编译时检查课堂中是否可以使用静态功能
- 朋友在课堂和外班上的功能,它有什么区别
- 我可以创建课堂功能类型吗?
- 课堂定义的朋友功能的范围
- 功能指针(在课堂内)
- 与朋友在课堂上进行内部功能,以隐藏公共细节
- 该程序应该在课堂上展示建设性和破坏性功能的功能
- 在课堂上和课堂外定义的朋友之间的区别:bug还是功能