如何使用命名空间和类?

Posted

技术标签:

【中文标题】如何使用命名空间和类?【英文标题】:How to use namespaces and classes? 【发布时间】:2017-04-16 18:55:14 【问题描述】:

对不起,如果这是一个愚蠢的问题,但我正在学习 C++(我通常用 C 编写代码)并且我不明白如何使用命名空间和类。它们是否必须在头文件中声明?如何在命名空间中声明函数?假设我正在处理一个包含不同文件的大型项目。我在一个文件中定义了一个命名空间,但随后想向同一个命名空间添加更多函数,但这些函数是在另一个文件中定义的。可以这样做吗?例如:

file1.cpp

namespace Example 
   int vartest;
   void foo();

file2.cpp

int othervar;
void otherfoo(); // How can I add this and othervar to the Example namespace?

谢谢!

【问题讨论】:

由于您是从 C 语言进来的,您可能会发现匿名命名空间是 static 的有用替代品。 namespace bool Ireturntrue() return true; 现在被很好地隔离了,并且在链接时不会增加名称污染。 【参考方案1】:

只需将其声明为具有相同“名称”的等效1namespace

file1.cpp

namespace Example 
   int vartest;
   void foo();

file2.cpp

namespace Example 
    int othervar;
    void otherfoo();

命名空间被合并。

它们必须在头文件中声明吗?

没有。您可以在namespace 中声明任何namespace。 (注意“全局作用域”也是namespace

如何在命名空间中声明函数?

只需在namespace 中声明即可。正如你所做的那样。

假设我正在处理一个包含不同文件的大型项目。 我在文件中定义了一个命名空间,但后来想添加更多 函数到同一个命名空间,但这些函数定义在 另一个文件。可以吗?

合并同一命名空间内的同名命名空间。

namespace X  void foo() 
namespace X  void foo()   //Error, redefinition of `foo` because the namespace ::X is merged

namespace X  void foo() 
namespace Y  void foo()   //Ok. Different name spaces... 

namespace X  void foo()   // ::X
namespace Y  void foo()   // ::Y

namespace Y 
   namespace X   // namespace ::Y::X here isn't same as ::X
     void foo()  //OK
   


1回想一下,所谓的“全局范围”实际上是一个命名空间,称为global namespace

【讨论】:

加 1 表示全局命名空间的最后一个注释。

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

如何强制 Visual Studio 2022 创建带有命名空间和类的控制台项目(就像过去的好日子一样)?

C# 常用 命名空间都有哪些 这些命名空间是的作用是?

C#中如何获得指定命名空间中所有自定义类的信息

C++问题:关于匿名命名空间

一个wpf命名空间问题

命名空间和类有啥区别? [关闭]