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

2019-07-18 14:16发布

我开始用C编写一个简单的解释++一类的结构,我下面会说明,但我退出,并在Java中改写了的事情,因为头是给了我一个困难时期。 下面是显然不是在C ++允许的基本结构:

main.cpp中包含的主要功能,并且包括了一类我们可以调用Printer.h中 (其单个空隙方法在printer.cpp被实现)的报头。 现在想象其他两个类是相同。 既想打电话给Printer::write_something(); ,所以我包括在每个Printer.h中 。 因此,这里是我的第一个问题:我为什么#include <iostream>一百万次,甚至一个接一个,但我只能包括我的头一次? (嗯,我想我大概可以做同样的事情与我的,只要它是在同一个文件,但我可能是错的)。我理解的声明和实现/定义之间的差异,但这些代码给了我一个类重定义错误。 我不明白为什么。 而这里的吹拂我的心灵(也可能说明你为什么我不明白任何的这一点)的东西:我不能只包括main.cpp中顶部的Printer.h和使用类从我的其他两个类。 我知道我可以包括两个类(头),没有麻烦的一个 Printer.h中 ,但我不明白为什么这不只是包括它之前,我包括main.cpp中的类有什么不同(因为这样做使我找不到类错误)。

当我厌倦了,我想过,因为我用了相当被迫反正OOP移动到C,但除非我在一个文件中写的一切,我会遇到同样的问题。 这是令人沮丧知道C ++,但无法正确地使用它,因为编制的问题。

我真的很感激,如果你能清楚这件事对我来说。 谢谢!

Answer 1:

我为什么#包括一百万次,甚至一个接一个,但我只能包括我的头一次?

这可能是因为你的头没有一个包括后卫 。

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

 // printer.h code goes here

#endif

需要注意的是要选择更长的名字为包括后卫定义,最大限度地减少两个不同的标题可能具有相同的一个机会的最佳实践。



Answer 2:

大多数的头文件应该被包裹在一个包括后卫:

#ifndef MY_UNIQUE_INCLUDE_NAME_H
#define MY_UNIQUE_INCLUDE_NAME_H

// All content here.

#endif

这样,编译器将只能看到每个翻译单元一次头的内容。



Answer 3:

C / C ++编译在编译/翻译单元划分以生成目标文件。 (的.o,.OBJ)

在这里看到的翻译单位的定义

在C #include指令/ C ++文件导致简单的递归复制粘贴在同一个文件中的直接等同。 你可以尝试做实验。

因此,如果同一转换单元包括相同的头两次编译器看到,一些实体被定义多次,因为如果你在同一个文件写出来会发生这种事。 错误输出将是完全一样的。

有没有内置在阻止你做多夹杂的语言保护,所以你不得不求助于编写包括后卫或特定的#pragma样板每个C / C ++头。



文章来源: C++ class redefinition error - Help me understand headers and linking