为啥要在命名空间中使用类

Posted

技术标签:

【中文标题】为啥要在命名空间中使用类【英文标题】:why to use classes inside namespace为什么要在命名空间中使用类 【发布时间】:2015-01-25 10:12:37 【问题描述】:

我想知道在命名空间内写类名的真正原因。他们解决什么目的?他们包括课程还是做其他事情?非常感谢任何帮助。

namespace ns3  
class Channel;
class SpectrumChannel;
class MyMod;                        ;

class NewModule : public NetDevice
   
public:
// methods and data

【问题讨论】:

搜索forward declaration 谢谢,这是告诉编译器我将来要使用这些类的一种方式,所以要做好准备?我很困惑,因为上面的包含文件不包括定义类(Channel、SpectrumChannel、MyMod)的文件。 它告诉编译器“我稍后会给你更多关于这些内容的细节,但我需要你知道它们现在存在”。在典型情况下,这意味着某处存在一个类,该类接受对这些类之一的引用或指针,但这不是实际定义内容的正确位置 - 或者类之间存在相互关系,所以类 Y 需要类 X,类 Y 以某种方式引用 X。 感谢 Mats,您的解释很有帮助。 【参考方案1】:

最好将您的类放入命名空间,以避免与您可能使用的其他代码(库)发生名称冲突(项目稍后也会出现)。当使用VectorLogger 等常用名称作为类名时,很容易发生它们也用于您想要使用的其他代码的情况。当您将类放入(经过深思熟虑的)命名空间时,名称冲突的可能性就会降到最低。

前向声明是一个不同的(独立的)主题。当类在命名空间内定义时,它们的前向声明也必须在该命名空间内完成。

【讨论】:

感谢您的解释,我仍然有以下问题:这是一种告诉编译器我将来要使用这些类的方法,所以要做好准备?我很困惑,因为上面的文件不包含定义类(Channel、SpectrumChannel、MyMod)的文件。 为了解析 C/C++ 编译器需要知道哪些标识符是指类型。如果在一个文件中只使用一个指针或一个类型的引用,编译器不需要知道类型的细节(大小,方法,..)来编译这个单个文件,所以前向声明就足够了。如果代码中有类型的循环依赖,则需要前向声明。使用前向声明的另一个原因是编译速度更快(前向声明类型的类定义不需要解析,并且当类更改时,您不必只使用前向 decl 重新编译代码) 谢谢,很有帮助。

以上是关于为啥要在命名空间中使用类的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在一个类中声明一个命名空间?

C#中类和命名空间是啥?为啥要用?啥时候用到?请高手详细说明

为啥结构必须与模板类在同一个命名空间中才能编译?

为啥我不能从不同命名空间中的朋友类更改类的私有成员?

为啥我不能创建在与类定义相同的命名空间中定义的 C++ 类的实例?

为啥要使用 __prepare__ 方法来获取类的命名空间?