为什么不同文件中的类在没有标题的情况下找不到对方?

时间:2013-03-01 14:23:15

标签: c++ visual-studio-2010 header-files

请查看以下代码

Main.cpp的

#include <iostream>

using namespace std;

int main()
{
    Class1 c;
}

Class1.cpp

#include <iostream>

using namespace std;

class Class1
{
public:
    void click1()
    {
        cout << "Click 1" << endl;
    }
};

Class2.cpp

#include <iostream>

using namespace std;

class Class2
{
public:
    void click2()
    {
        cout << "Click 2" << endl;
    }
};

如果我将头文件添加到上面的类,它们可以工作。为什么C ++在没有头文件的情况下不理解不同文件中的类?

4 个答案:

答案 0 :(得分:6)

在C ++中,源文件称为翻译单元。每个翻译单元彼此分开,基本上不了解彼此的存在。您必须明确告诉编译器翻译单元应该了解的内容。

这是通过声明来完成的。而不是在许多文件和地方使用相同的声明,而是将它们放在所有源文件包含的单个头文件中。

答案 1 :(得分:1)

  

为什么C ++在没有头文件的情况下不理解不同文件中的类?

为什么要这样?没有约定要求以某种方式命名文件名,或者每个文件包含一个公共类。您可以将整个类层次结构放在单个头文件中,只要它在逻辑上有意义即可。例如,<algorithms>标题不包含任何名为"algorithms"的内容,但名称非常直观。

最后,C ++中没有要求内部类或类模板的内容。您可以拥有充满命名空间级C风格函数声明的文件。没有合理的命名约定来支持这种性质的文件。

#include指令解决了这个问题,并且您可以灵活地按照自己的方式命名文件。

答案 2 :(得分:1)

  

为什么C ++在没有头文件的情况下不理解不同文件中的类?

这就是C ++(坏)编译模型的工作原理。

编译器分别处理每个翻译单元(.cpp文件) ;然后,链接器合并处理各个编译单元所产生的所有obejct文件,以创建程序的可执行文件。

在处理一个翻译单元时,编译器将看不到在处理其他翻译单元时已解析的实体。

  

如果我将头文件添加到上面的类中,它们可以正常工作

这是因为#include相应的标题使得每个翻译单元对这些实体的声明(或定义)可见,需要使用它们。

答案 3 :(得分:1)

头文件的目的主要是声明项目。在C ++中,必须始终声明任何类,变量等。如果不提供这些,则编译器无法找到相应的类,变量等。

请参阅SO