在头文件中使用std

Using std in header files

本文关键字:std 文件      更新时间:2023-10-16

是否有在头文件中使用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。有两种方法可以实现这一点:

  1. 包括标题A顶部的B
  2. 或者:凡是包括A的地方,都要在A之前加上B

但是,标头应该是自包含的,因此首选方法1。