在头文件中使用std
Using std in header files
是否有在头文件中使用std而不使用任何#include语句的选项?我在一个头文件中有一个类,如下所示;
class Sequence{
private:
std::string sequence;
unsigned length;
public:
/* Constructors */
Sequence (void);
Sequence (std::string, unsigned);
Sequence (const Sequence &);
/* Destructor Definition */
~Sequence(){}
/* Overloaded Assignment */
Sequence & operator
= (const Sequence &seq)
{
sequence = seq.sequence;
length = seq.length;
return *this;
}
/* Setter and Getter Functions */
void setSequence(std::string);
void setLength(unsigned);
std::string getSequence(void);
int getLength(void);
};
如果不包含iostream,它将无法正确编译。然而,我在相关问题中读到了一些评论,其中我们不应该在头文件中包括库和其他头文件。所以
如果在您自己的标头A中,您依赖于另一个标头B的类型定义或函数声明(无论是标准标头还是其他标头),那么您必须在标头A中包含标头B。
一般来说,你无法避免它。在某些情况下,你可能只依赖于某个类型的声明,在这种情况下,可以通过使用正向声明来避免包含定义。但是,这不适用于标准库中的类型,因为这些类型位于命名空间中,您可以不声明任何内容。
如果不包括iostream ,则无法正确编译
实际上,类定义依赖于<string>
。<iostream>
可能包含<string>
,但不能依赖于此。请改为包含<string>
,因为您使用的是在其中定义的类型(std::string
)。
我们不应该在头文件中包含库和其他头文件。
您必须包括所依赖的所有标头,无论它们是否来自库。同时包含库标头和其他标头并没有错。
有时您可以使用正向声明。查看转发声明了解更多信息。在不能使用正向声明的情况下,在翻译单元中使用之前必须包含所需的标头。例如,如果标题A依赖于标题B,则在A将其用于翻译单元之前,必须包含B。有两种方法可以实现这一点:
- 包括标题A顶部的B
- 或者:凡是包括A的地方,都要在A之前加上B
但是,标头应该是自包含的,因此首选方法1。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- 使 std::fstream 写入文件末尾,但从头开始读取
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- 是否可以使用 std::文件系统获取根名称列表?
- llvm 9在10.15之前的mac版本上支持std::文件系统吗
- std::文件系统根路径如何将自身作为父路径?
- 将 std::文件系统头文件添加到我的程序时出现编译错误
- 使用 std::文件系统替换文件
- std::文件系统和 std::experimental::文件系统问题在不同的编译器中
- XCode链接到STD ::文件系统的哪个库
- 使用 std::文件系统输出作为 LPCWSTR
- Visual Studio 中的 std 文件中的错误
- std文件流的相对路径
- 如何返回STD文件流
- 为什么在 C++1y 中没有接口来获取 std 文件系统库扩展中的用户/组信息