1

我有一个名为“Animal”的类,它是一个超类和纯多态。我还有其他类“狗”、“猫”、“仓鼠”等。它们都继承自“动物”类。

在一个程序中,我需要包含所有子类(狗、猫、仓鼠),但是,当我这样做时:

#include "Hamster.h"
#include "Dog.h"
...
...

我得到错误:

'class Animal' 的先前定义</p>

有没有办法防止这种情况?

PS我想过做一个:

#ifdef

但是,如果使用了该类,则将其包含在内。例如,如果程序试图创建一个 Cat 类,则执行包含。

抱歉,如果没有很好地解释。

4

4 回答 4

7

在头文件中使用包含保护:

#ifndef ANIMAL_H
#define ANIMAL_H

//definitions

#endif
于 2012-10-29T14:46:25.200 回答
5

在每个标题的顶部,放置一个

#pragma once

国际标准只是说如果编译器不理解它就必须忽略它。

几乎所有编译器都理解它,这是一个事实上的标准。

的替代方法#pragma是使用

#ifndef MYHEADER_H
#define MYHEADER_H

// Contents of header

#endif

哪个更丑陋,更冗长,更不容易正确,可能因名称冲突而失败,效率可能更低,但这是完全标准的。

无论如何,这个想法是防止标题内容,如类定义,被包含在同一个翻译单元中两次或更多次。

但是请注意,您可以在同一个翻译单元中执行相同typedef的 s。

于 2012-10-29T14:50:25.513 回答
1

您可以#pragma once在头文件中使用,但它不可移植为#ifndef

于 2012-10-29T14:47:07.477 回答
0

#pragma once在你的头文件中使用。

于 2017-03-17T20:49:07.853 回答