是否有任何选项可以在不使用任何#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,则无法正确编译。但是,我在相关问题中阅读了一些注释,其中我们不应该在头文件中包含库和另一个头文件。所以?
答案 0 :(得分:5)
如果在您自己的标题A中,您依赖于类型定义或来自另一个标题B的函数声明(无论是标准标题还是其他标题),那么您必须在标题A中包含标题B.
一般来说,你无法避免它。在某些情况下,您可能只依赖于类型声明,在这种情况下,您可以通过使用前向声明来避免包含该定义。但是,这不适用于标准库中的类型,因为它们位于命名空间中,您可能不会声明任何内容。
如果不包含iostream
,则无法正确编译
实际上,您的班级定义取决于<string>
。 <iostream>
可能包含<string>
,但您不能依赖它。请改为使用<string>
,因为您使用的是那里定义的类型(std::string
)。
我们不应在头文件中包含库和其他头文件。
您必须包含您依赖的所有标头,无论它们是否来自库。包括库头和其他头文件没有任何问题。
答案 1 :(得分:0)
有时你可以使用前瞻声明。查看前向声明以获取更多相关信息。如果您不能使用转发声明,则必须在转换单元中使用之前包含所需的标头。例如,如果标题A依赖于标题B,则必须在A在翻译单元中使用它之前包括B.有两种方法可以实现这一目标:
但是,标题应为自包含,因此首选方法1。