Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在包含类定义的标头中包含其他标头_C++_Header Files_Declaration_Cout - Fatal编程技术网

C++ 在包含类定义的标头中包含其他标头

C++ 在包含类定义的标头中包含其他标头,c++,header-files,declaration,cout,C++,Header Files,Declaration,Cout,为什么我们需要将头(如string,iostream)包含在包含类定义的头中(类需要I/O或字符串按比例分配)-因为头已经包含在包含该类头的cpp转换单元中 这似乎是内容的翻倍。标题材料不是首先粘贴到包含它的cpp文件中吗 例如: //HEADER #ifndef SAMPLE_H #define SAMPLE_H class sample { public: sample(); } sample::sample() { cout<&l

为什么我们需要将头(如
string
iostream
)包含在包含类定义的头中(类需要I/O或字符串按比例分配)-因为头已经包含在包含该类头的cpp转换单元中

这似乎是内容的翻倍。标题材料不是首先粘贴到包含它的cpp文件中吗

例如:

 //HEADER
 #ifndef SAMPLE_H
 #define SAMPLE_H

 class sample
 {
      public:
      sample();
 }

 sample::sample()
 {
     cout<<"Constructor!!!\n";     //error
 }

 #endif


//CPP
#include<iostream>
#include"m.h"

using namespace std;

int main()
{
    m obj();
    return 0;
}
//头
#ifndef样本
#定义样本
类样本
{
公众:
样本();
}
sample::sample()
{

对于初学者,请注意类定义中有一个输入错误。您放弃了在类定义后放置分号

class sample
{
      public:
      sample();
};
^^^ 
在某些上下文中使用的名称在使用前应已声明

因此,如果类定义引用了标准类std::string,那么应该包括头

考虑到标头可由其他用户或编译单元使用,这些用户或编译单元在使用带有类定义的标头之前不知道需要包含标头

在标题示例中,您必须包含标题
,并使用限定名称
std::cout
,或对
std::cout
使用声明,或对命名空间
std
使用指令


否则,此标头可能是错误源,因为标头的用户在包含标头之前可能会忘记将标头
包含在程序中。

您不必包含其他标头;您可以有一个文件结构,仅将必要的
\include
指令放在源中文件。但那真的很烦人,很快

// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
struct S { std::string data; };
#endif MYHEADER_H

// test.cpp
#include <string>
#include "myheader.h"
S s; // ok
通常的惯例是编写可自行编译的头文件:

// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
#include <string>
struct S { std::string data; };
#endif MYHEADER_H

并且只获取一次myheader.h的内容。事实上,如果您省略了include防护,那么如果您尝试在同一个cpp文件中多次包含同一个头,您将得到一个错误。

您可能会忽略的是,
m.h
不仅包含在
test.cpp
中,而且可能还包含在许多需要
类的其他文件中示例
。如果在
m.h
中未包含
,则强制其他文件在
m.h
之前包含

对于较大的项目,您的策略可能会使标题顺序变得非常困难。E.cpp中A.h到D.h的顺序应该是什么?E.cpp的作者如何知道


这条规则有一个可行的例外。实际上,您可以有一个始终首先包含的项目范围的元头,它又包括一些常见的头,例如
。如果您使用此策略,这些头不需要包含在您自己的
.h
文件中。这种方法是特别的与Visual C++一般情况下,这样的标题通常被命名为“代码> STDAFX.H./COD> .< /P>我们不可能只包含代码> iOSFWD< /Cord>,但是这取决于自定义类头是如何编写的。您有一个具体的例子吗?可能阅读的内容包括保护程序,例如,@现在请看一看。我已经编辑了这个问题,请您重新检查一下。我理解您的观点,但在我的例子中,我已经在cpp中包含了
iostream
using
指令,那么为什么它会抛出error@Observer您可能在标题后包含它们。它们必须在标题前包含。
// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
#include <string>
struct S { std::string data; };
#endif MYHEADER_H
// test1.cpp
#include "myheader.h"
#include "myheader.h"