【问题标题】: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,您的解释很有帮助。

标签: c++ class namespaces


【解决方案1】:

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

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

【讨论】:

  • 感谢您的解释,我仍然有以下问题:这是一种告诉编译器我将来要使用这些类的方法,所以要做好准备?我很困惑,因为上面的文件不包含定义类(Channel、SpectrumChannel、MyMod)的文件。
  • 为了解析 C/C++ 编译器需要知道哪些标识符是指类型。如果在一个文件中只使用一个指针或一个类型的引用,编译器不需要知道类型的细节(大小,方法,..)来编译这个单个文件,所以前向声明就足够了。如果代码中有类型的循环依赖,则需要前向声明。使用前向声明的另一个原因是编译速度更快(前向声明类型的类定义不需要解析,并且当类更改时,您不必只使用前向 decl 重新编译代码)
  • 谢谢,很有帮助。
猜你喜欢
  • 2020-11-24
  • 2015-11-13
  • 2011-03-20
  • 1970-01-01
  • 2015-02-10
  • 2020-08-07
  • 1970-01-01
  • 2010-12-05
  • 2013-11-18
相关资源
最近更新 更多