c++ - 使用命名空间标准;在头文件中

标签 c++ class namespaces header-files

所以,我在规范文件中有以下内容

#include <string>
#include <fstream>
using namespace std:

class MyStuff
{
    private:

    string name;
    fstream file;
    // other stuff

    public:
    void setName(string);
}

我在实现文件里也有

#include "MyStuff.h"
using namespace std;

void MyStuff::setName(string name);
{
     name = name
}

在我的程序文件中...

#include <iostream>
#include <string>
using namespace std;

void main()
{
     string name;
     MyStuff Stuff;

     cout << "Enter Your Name: ";
     getline(cin, name);

     Stuff.setName(name);
}

我正在收集应用“使用命名空间 std;”在头文件中是禁止的,完全符合条件是“更好”的做法;如std::cout << stuff << endl;

据我了解,要使用字符串,它必须具有 std 命名空间。这是真的吗?

如果是这样,在头文件中,更“纯粹/干净”的做法是......

#include <string>

class MyStuff
{
     std::string name;
}

而且,据我目前了解,使用命名空间 std;跨越所有三个文件,规范、实现和程序,基本上将三个命名空间叠加在一起,所以如果我分别声明 string name;在每个文件中,编译器将不知道哪个文件指向哪个文件。这是真的吗?

我一般都明白,清楚是一件“好”的事情,但我对具体如何做有点不清楚,我最感兴趣的是更深层次的“为什么”,这是这一切的基础。

所以我的直接问题是,在我提供的示例中,为编译器和行业“标准”描述函数的“最清晰”方式是什么?而且,您能否将我引导到更清楚地描述命名空间的推理和实际实现的资源。

最佳答案

假设我自己声明了一个类string。因为我是一个懒惰的流浪汉,所以我在全局命名空间中这样做。

// Solar's stuff
class string
{
    public:
        string();
        // ...
};

一段时间后,我意识到重用一些您的代码将有益于我的项目。感谢您将其开源,我可以这样做:

#include <solarstuff.hpp>
#include <phoenixstuff.hpp>

string foo;

但是突然编译器不再喜欢我了。因为有一个 ::string (我的类(class))和 another ::string (标准的,包含在您的标题中并带入全局namespace with using namespace std;),有各种痛苦。

更糟糕的是,这个问题会通过每个包含 my header 的文件(包括您的 header ,...您明白了。)

是的,我知道,在这个例子中,我也应该责备我没有在我自己的命名空间中保护我自己的类,但那是我临时想出的。

命名空间是为了避免标识符冲突。您的 header 不仅将 MyStuff 引入全局命名空间,还引入了来自 stringfstreamevery 标识符。很可能它们中的大多数都不是我们两个人真正需要的,那么为什么要把它们拖到全局,污染环境呢?

补充: 从维护编码器/调试器的角度来看,foo::MyStuffMyStuff, namespace' 方便十倍d 其他地方(甚至可能不是同一个源文件),因为您可以在代码中需要它的位置获得命名空间信息。

关于c++ - 使用命名空间标准;在头文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575799/

相关文章:

c++ - 如何跟踪通话统计? C++

ruby - 将值传递给 Ruby 类

来自构造函数的 C++ 虚函数

c++ - 有没有一种有效的方法来 'enumerate' C++ 中的命名空间?

c++ - 在没有 msgpack_define 的情况下将 msgpack 解包到任意对象

c++ - auto 是如何推断类型的?

c++ - 如何在鼠标左键按下时触发循环 autoclicker c++

c++ - 无法在输出中获取正确的分数值

c# - DataContractSerializer 无法在命名空间更改后反序列化

javascript - 理解 JavaScript 中的命名空间