【发布时间】:2017-05-31 06:31:33
【问题描述】:
是否有任何选项可以在不使用任何#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,则无法正确编译。但是,我在相关问题中阅读了一些 cmets,其中我们不应该在头文件中包含库和另一个头文件。那么?
【问题讨论】:
-
你有两个选择:要么在你的头文件中包含你需要的头文件。或者确保在包含头文件之前将依赖项包含在源文件中。哪个最好?两者都一样好,你选择哪一个取决于个人喜好。
-
“我们不应该在头文件中包含库和其他头文件” 该建议不适用于标准库。您必须包含在这种情况下使用的标头
#include <string>。只有forward declarations,您才能避免其他包含。 -
如果您在界面中使用
std::string,将它包含在使用它的源文件中并不同样好,因为您必须确保每次使用标题时都包含它。这包括客户端代码。 -
@SomeProgrammerDude “两者都一样好” 几乎没有。一个要求我仔细整理我的包含语句,经常挖掘多层试图弄清楚。 头文件应该是完全独立的,包括它们所引用类型的所有头文件。这就是我们包含守卫的原因。
-
@omerfaruk 一些系统头文件可能包含其他系统头文件,但它是特定于实现的东西。如果你需要
std::string,那么你应该包括<string>。此外,源代码的包含部分充当一种关于您所依赖和使用的文档的文档。
标签: c++ std header-files iostream