0

请看下面的代码

主文件

#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;
    }
};

类2.cpp

#include <iostream>

using namespace std;

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

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

4

4 回答 4

6

在 C++ 中,源文件称为翻译单元。每个翻译单元相互独立,基本不知道彼此的存在。您必须明确告诉编译器翻译单元应该知道什么。

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

于 2013-03-01T14:26:58.810 回答
1

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

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

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

#include指令解决了这个问题,并让您可以灵活地以您想要的方式命名文件。

于 2013-03-01T14:25:26.440 回答
1

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

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

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

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

如果我将头文件添加到上述类,它们就可以工作

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

于 2013-03-01T14:25:51.717 回答
1

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

SO

于 2013-03-01T14:26:23.863 回答