2

我在 C++ 中包含头文件时遇到问题。据我所知,将using namespace std标题放入内部并不是一个好的设计,但是当我尝试将其删除时出现了一些错误。这是我在头文件中的代码:

#include <iostream>
#include <string>

//using namespace std;
class Messages
{
public:
Messages(string sender, string recipient,int time);
void append();
string to_string();


private:
int time;
string sender;
string recipient;
string text;

};

我确实包括<string>. 但是,如果我不使用命名空间 std,我的所有字符串都会显示错误。我不想添加using namespace std头文件,因为这是一个糟糕的设计。那么我该如何解决呢?

提前致谢。

4

2 回答 2

5

std::string到处写就行了。

#include <iostream>
#include <string>

//using namespace std;
class Messages
{
public:
Messages(std::string sender, std::string recipient,int time);
void append();
std::string to_string();


private:
int time;
std::string sender;
std::string recipient;
std::string text;

};

根据经验法则:无论何时(即使在 .cpp 文件中)您使用标准库中的任何数据类型或算法,只需在其前面加上std::. 它足够简短,可以打字,它将为您节省一个痛苦的世界。

高级用户在函数范围内使用 using 声明有一些原因,例如,当您想要swap从标准库重载一个函数(例如 )以使用您自己的数据类型(在他们自己的命名空间内)时。请参阅此问答,了解它是如何工作的。

于 2013-05-22T08:23:09.770 回答
3

该类在命名空间string内声明。您可以通过三种方式来寻址位于不同命名空间内的类: std

  1. 总是写<namespace>::<class>
  2. 通过明确声明任何对<class>实际的引用都意味着 1. above: using <namespace>::<class>;
  3. 通过声明在当前<class>命名空间中无法解析的任何对 a 的引用也应在附加命名空间中查找:using namespace <namespace>;

这些是按表现力的降序排列的。虽然 1. 在任何地方都非常清楚,但 3. 如果您不熟悉所使用的(可能有多个)命名空间,则可能需要一些查找和摸索。

这些也按所涉及的键入的降序排序,这就是为什么有些人(尤其是教科书)选择 3。

但是,您永远不应该在头文件中使用using ...,因为您不仅会弄乱头文件中的命名空间解析,还会弄乱包括您的头文件在内的每个人的名称空间解析。这会导致命名空间冲突、取决于包含顺序的奇怪错误以及许多其他令人头疼的问题。只是不要。

一般来说,虽然在实现文件中选项 1. 和 2. 涉及一些优点和缺点,但选项 3. 对以后必须使用您的源代码的任何人来说都是冒犯的。

于 2013-05-22T08:33:52.110 回答