头文件中的字符串原型需要iostream

String prototype in header requires iostream?

本文关键字:iostream 原型 字符串 文件      更新时间:2023-10-16

所以在我的头,我做了一个字符串:string s;编译器在这个怪胎。我知道string是iostream::std的一部分。我必须包括它在头,而不是在。cpp文件吗?如果是这样,它是坏的,如果其他文件使用头包括iostream?我该怎么处理呢?

编辑:也为矢量,因为它似乎我将需要它在我的作业很多。

编辑2:我记得在标题的很多例子中看到#ifndef,我觉得它可能有助于我的问题,但我似乎找不到一个好的解释。

stringvector是与iostream分开的,它们都是std命名空间的一部分。你只需要在你的头文件中适当地限定它们。

Assignment.h

 #include <string>
 #include <vector>
 // no need to #include <iostream>
 struct Obj
 {
    // fully qualified with std::
    std::string s_;
    // same:
    std::vector<std::string> v_;
 };

如果需要,可以在其他头文件中包含头文件,并且不要创建循环依赖关系。这里的情况不是这样,因为<string>不是用户生成的标头。

如果您将using namespace std;添加到标题中而不是指定类型的范围,那将是不好的。这样做可以在包含头文件的所有文件中用namespace std的内容填充全局命名空间。

当然,如果您在自己的头中使用string,则需要包含头。这是因为编译器需要计算具有string成员的对象的内存布局,这意味着它需要首先计算string的布局,这意味着它必须看到string的完整声明。

没有直接的方法可以解决这个问题,但如果这对你来说是一个问题,你可以使用粉刺习语来解决它。这种模式的好处之一是,它允许您在类中聚合对象,而不需要首先包含其声明(而不是向前声明该类),如下所示:

class std::string; // forward declaration
class my_class
{
    std::string* psz;
};

当然,现在你负责构造一个string,并获得一个指针到它自己,也手动管理该对象。此外,访问该字符串现在需要额外的指针解引用。

是的,你需要包括<string>,因为std::string实际上是basic_string模板的typedef

typedef basic_string<char> string;

如果它是一个类,在某些情况下你可以不包括它的定义而直接声明它。

class string;