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;