如何使用命名空间和类?

3

很抱歉如果这是一个愚蠢的问题,但我正在学习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; } }已经被很好地隔离开来,在链接时不会增加名称污染。 - user4581301
1个回答

4

只需将其声明为相同名称的等效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 请注意,所谓的“全局作用域”实际上是一个名为全局命名空间的命名空间。


在全局命名空间中,对最后一个注释加1。 - Santiago Varela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接