【问题标题】:Appropriate use of namespace in C++ [duplicate]在 C++ 中适当使用命名空间 [重复]
【发布时间】:2017-09-13 09:44:02
【问题描述】:

来自Java背景,我已经习惯了通过引用对象及其方法来创建一个对象并在主类中使用它的方法,例如:

object.objectMethod();

拥有具有相同名称方法的不同类不是问题,但现在我正在 Arduino 中做一个几乎是 C++ 的项目。 tutorial on using classes in Arduino 建议在每个方法之前在 .cpp 文件中使用类名和双冒号。一些谷歌搜索让我相信这被称为命名空间。进一步搜索 C++ 中的命名空间会产生各种使用命名空间的选项,但它们都不像 Arduino 教程中的那样,这让我感到困惑。

我的问题:命名空间的适当用途是什么?在链接教程中使用它是否是一种好习惯?

【问题讨论】:

  • 可能是命名空间,可能是函数所属的类的名称。查阅 C++ 教科书可能是个好主意。
  • Java 和 C++ 本质上是不同的,尽管它们在语法上很相似。不要试图在 C++ 中模仿 Java 编程风格,这会导致糟糕的结果。
  • 提醒:C++ 允许独立函数。并非所有内容都必须在一个类中。
  • 事实上,快速浏览一下教程会发现“函数名前的第一个是 Morse::。这表示该函数是 Morse 类的一部分。”
  • 您永远不必创建命名空间;它们是一个方便的功能。如果您想做 OOP(您不必这样做),那么您需要使用类。如果你使用类,并且类 A 和 B 都有一个名为 f() 的函数,那么这两个函数的全称是 A::f() 和 B::f()。正如我所说,阅读一本 C++ 教科书 - 没有一本,你将无法学习使用该语言。

标签: c++ namespaces


【解决方案1】:

当您在 C++ 中看到 :: 时,它并不意味着命名空间。 :: 是范围解析运算符。在 C++ 中定义范围有不同的方式,命名空间和类是其中两种方式。如果您的原始问题,解释它们的区别、优缺点超出了范围。

要以更迂回的方式回答您的问题,是的,将函数放在类和命名空间中是好的 C++。否则,您的函数将全部在全局范围内结束。这使得编程非常混乱,并且破坏了 C++ 的大部分设计。

但是,简单地编写 Foo::Baz() 也不会将 Foo 定义为类或命名空间。

要正确使用命名空间,首先要声明它,然后声明成员函数:

namespace MyCoolNamespace {
    void aFunction();
    void anotherFunction(bool b);
}

然后像这样定义函数:

void MyCoolNamespace::aFunction()
{
    /* something this function does */
}

然后可以按照教程中提到的方式调用它(但是请记住,教程的范围是一个类,而不是命名空间!)

MyCoolNamespace::aFunction();

或在 using 关键字的帮助下调用:

using namespace MyCoolNamespace;

aFunction();

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 2016-07-26
    • 1970-01-01
    • 2013-08-01
    • 2014-08-26
    • 2012-07-18
    • 1970-01-01
    • 2014-05-10
    • 2011-05-05
    相关资源
    最近更新 更多