C++类重定义错误 - 帮助我理解标题和链接

ICo*_*mer 2 c++ linker header redefinition

我开始用C++编写一个简单的解释器,我将在下面描述一个类结构,但是我放弃并重写了Java中的东西,因为标题让我很难过.这是C++中显然不允许的基本结构:

main.cpp包含main函数,并包含一个我们可以调用printer.h的类的头文件(其single void方法在printer.cpp中实现).现在想象另外两个相同的类.两个人都想打电话Printer::write_something();,所以我在每个都包含了printer.h.所以这是我的第一个问题:为什么我可以#include <iostream>一百万次,甚至一个接一个,但我只能包括我的标题一次?(好吧,我想我可能会对我做同样的事情,只要它在同一个文件中.但我可能是错的.)我理解声明和实现/定义之间的区别,但是代码给了我一个类重新定义错误.我不明白为什么.这就是让我大吃一惊的事情(可能会告诉你为什么我不理解这一点):我不能只在main.cpp的顶部包含printer.h并使用我的其他两个类中的类.我知道我可以在两个类(标题)中的一个中包含printer.h而没有任何问题,但我不明白为什么这与在main.cpp中包含类之前包含它有什么不同(这样做会给出我找不到错误的课程).

当我厌倦了,我想到移动到C,因为我正在使用的OOP是非常强制的,但我会遇到同样的问题,除非我在一个文件中写入所有内容.知道C++但由于编译问题而无法正确使用它是令人沮丧的.

如果你能为我清楚这一点,我将非常感激.谢谢!

jua*_*nza 6

为什么我可以#include一百万次,甚至一个接一个,但我只能包括我的标题一次?

这可能是因为你的标题没有包含警戒.

// printer.h file
#ifndef PRINTER_H_
#define PRINTER_H_

 // printer.h code goes here

#endif
Run Code Online (Sandbox Code Playgroud)

请注意,最佳做法是为include guard定义选择较长的名称,以最大限度地减少两个不同标头可能具有相同标头的可能性.


asc*_*ler 5

大多数头文件应该包含在包含保护中:

#ifndef MY_UNIQUE_INCLUDE_NAME_H
#define MY_UNIQUE_INCLUDE_NAME_H

// All content here.

#endif
Run Code Online (Sandbox Code Playgroud)

这样,编译器对于每个翻译单元只会看到一次标头的内容。