在头文件中使用std

时间:2017-01-16 12:04:52

标签: c++ std header-files iostream

是否有任何选项可以在不使用任何#include语句的情况下在头文件中使用std?我在头文件中有一个类如下;

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,则无法正确编译。但是,我在相关问题中阅读了一些注释,其中我们不应该在头文件中包含库和另一个头文件。所以?

2 个答案:

答案 0 :(得分:5)

如果在您自己的标题A中,您依赖于类型定义或来自另一个标题B的函数声明(无论是标准标题还是其他标题),那么您必须在标题A中包含标题B.

一般来说,你无法避免它。在某些情况下,您可能只依赖于类型声明,在这种情况下,您可以通过使用前向声明来避免包含该定义。但是,这不适用于标准库中的类型,因为它们位于命名空间中,您可能不会声明任何内容。

  

如果不包含iostream

,则无法正确编译

实际上,您的班级定义取决于<string><iostream>可能包含<string>,但您不能依赖它。请改为使用<string>,因为您使用的是那里定义的类型(std::string)。

  

我们不应在头文件中包含库和其他头文件。

您必须包含您依赖的所有标头,无论它们是否来自库。包括库头和其他头文件没有任何问题。

答案 1 :(得分:0)

有时你可以使用前瞻声明。查看前向声明以获取更多相关信息。如果您不能使用转发声明,则必须在转换单元中使用之前包含所需的标头。例如,如果标题A依赖于标题B,则必须在A在翻译单元中使用它之前包括B.有两种方法可以实现这一目标:

  1. 在标题A的顶部包含B.
  2. 或:包含A的所有地方,在A之前包括B.
  3. 但是,标题应为自包含,因此首选方法1。