C++ 标头中的字符串原型需要iostream吗?

C++ 标头中的字符串原型需要iostream吗?,c++,C++,因此,在我的标题中,我创建了一个字符串:strings编译器在这一点上发疯了。我知道字符串是iostream::std的一部分。那么我是否必须将其包含在头文件中而不是.cpp文件中?如果是这样的话,如果使用头的其他文件包括iostream,这是否不好?我该怎么处理呢 编辑:也适用于vector,因为在我的作业中我似乎非常需要它 编辑2:我记得在许多标题示例中看到了“ifndef”,我觉得这可能有助于回答我的问题,但我似乎找不到一个好的解释。如果您在自己的标题中使用字符串的标题,您确实需要包含它。

因此,在我的标题中,我创建了一个字符串:
strings编译器在这一点上发疯了。我知道字符串是iostream::std的一部分。那么我是否必须将其包含在头文件中而不是.cpp文件中?如果是这样的话,如果使用头的其他文件包括iostream,这是否不好?我该怎么处理呢

编辑:也适用于vector,因为在我的作业中我似乎非常需要它


编辑2:我记得在许多标题示例中看到了“ifndef”,我觉得这可能有助于回答我的问题,但我似乎找不到一个好的解释。

如果您在自己的标题中使用
字符串的标题,您确实需要包含它。这是因为编译器需要计算具有
string
成员的对象的内存布局,这意味着它需要首先计算
string
的布局,这意味着它必须查看
string
的完整声明

没有直接的方法可以解决这个问题,但是如果您遇到问题,您可以使用。此模式的好处之一是,它允许您聚合类中的对象,而无需首先包含其声明(而是向前声明该类),如下所示:

class std::string; // forward declaration

class my_class
{
    std::string* psz;
};

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

string
vector
iostream
分开,这三者都是
std
命名空间的一部分。您只需要在头文件中正确地限定它们

作业.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_;
 };
#包括
#包括
//不需要包括
结构对象
{
//完全符合标准:
std::字符串s;
//相同:
std::向量v_;
};

如果需要,可以在其他头中包含头,并且不创建循环依赖项。这里不是这样,因为
不是用户生成的头


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

是的,您需要包含
,因为
std::string
实际上是
基本字符串的
typedef
模板

typedef basic_string<char> string;

string是std::string的一部分,对于Edit2来说,这些都是包含保护的,与您的问题完全无关。
class string;