Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何停止类的重新定义_C++ - Fatal编程技术网

C++ 如何停止类的重新定义

C++ 如何停止类的重新定义,c++,C++,我有一个叫做“Animal”的类,它是一个超级类,是纯多态的。我还有其他的课程“狗”、“猫”、“仓鼠”等等。。所有这些都是从“动物”类继承的 在一个程序中,我需要包括所有子类(狗、猫、仓鼠),但是,当我这样做时: #include "Hamster.h" #include "Dog.h" ... ... 我得到一个错误: “动物类”的先前定义 有没有办法防止这种情况 另外,我想做一个: #ifdef 但是,如果类get被使用,那么就包含它。例如,如果程序试图发起Cat课程,则执行包含 如果解

我有一个叫做“Animal”的类,它是一个超级类,是纯多态的。我还有其他的课程“狗”、“猫”、“仓鼠”等等。。所有这些都是从“动物”类继承的

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

#include "Hamster.h"
#include "Dog.h"
...
...
我得到一个错误:

“动物类”的先前定义

有没有办法防止这种情况

另外,我想做一个:

#ifdef
但是,如果类get被使用,那么就包含它。例如,如果程序试图发起Cat课程,则执行包含


如果解释得不好,很抱歉。

在头文件中使用include-guard:

#ifndef ANIMAL_H
#define ANIMAL_H

//definitions

#endif

在头文件中使用include-guard:

#ifndef ANIMAL_H
#define ANIMAL_H

//definitions

#endif

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

在每个头文件的顶部,放置一个

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

但是,这是事实上的标准

#pragma
的替代方法是使用

#ifndef MYHEADER_H
#define MYHEADER_H

// Contents of header

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

无论如何,这个想法是为了防止标题内容(如类定义)在同一个翻译单元中包含两次或两次以上


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

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

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

但是,这是事实上的标准

#pragma
的替代方法是使用

#ifndef MYHEADER_H
#define MYHEADER_H

// Contents of header

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

无论如何,这个想法是为了防止标题内容(如类定义)在同一个翻译单元中包含两次或两次以上


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

在头文件中使用
#pragma once

在头文件中使用
#pragma once

和hth.-AlfCh您好,所以我有:#pragma once#include“./anies/Cat.h”#include“./anies/Dog.h”(显然在不同的行上),但仍然显示错误。有什么想法吗?作为一个事实标准,它似乎没有被广泛使用。至少,我从未在生产代码中见过它(包括在Windows下)。当然,无论是否使用
#pragma once
,您仍然需要包含保护,因为编译器无法可靠地判断它正在处理同一个文件。(它不能可靠地实现,这就是标准委员会拒绝它的原因。)@Phorce:您将它放在每个头文件的顶部,而不是主程序的include集合之前directives@James:你可能会读到链接到维基百科的文章。在过去,g++在符号链接方面有一些问题,因此您关于“同一个文件”和“不可靠”的陈述是正确的。它不再是正确的。g++不喜欢#pragma oncean和hthAlfCh您好,所以我有:#pragma once#include“./anies/Cat.h”#include“./anies/Dog.h”(显然在不同的行上),但仍然显示错误。有什么想法吗?作为一个事实标准,它似乎没有被广泛使用。至少,我从未在生产代码中见过它(包括在Windows下)。当然,无论是否使用
#pragma once
,您仍然需要包含保护,因为编译器无法可靠地判断它正在处理同一个文件。(它不能可靠地实现,这就是标准委员会拒绝它的原因。)@Phorce:您将它放在每个头文件的顶部,而不是主程序的include集合之前directives@James:你可能会读到链接到维基百科的文章。在过去,g++在符号链接方面有一些问题,因此您关于“同一个文件”和“不可靠”的陈述是正确的。它不再是正确的。g++不喜欢“pragma”,因为事实上,没有一个系统可以让
“pragma once
可靠地工作。@James:你错了。特别是,它的工作可靠的G++和Visual C++。同样,你可能会从阅读维基百科的文章中受益。关于这一点有很多争议,但尽管它确实得到了一些相关的事实摆在桌面上,但它受到了通常缺乏辩论支持的困扰。因此,论点通常没有用例子来证实,许多论点只是主张性的观点(如您在这里介绍的观点)。@Alf它不适用于g++,至少在Linux或Solaris下不适用。我看到它失败了。根据在Windows下用VC++进行试验的人说,它也有同样的问题。在现实生活中,在大型项目中,可以从几个不同的路径访问文件(由于automount之类的原因),系统将它们视为完全不同的文件。(我可以清楚地记得一个同事在<代码> /tMP目录中做了<代码> RM- R/COD>,并且丢失了他的整个home目录。)大多数时候,这些目录不包含C++头,但他们可以。@杰姆斯:提供一个完整但极小的例子,显示你所指的行为“不起作用”,并提交错误报告。或者“它不起作用”没有发生,就像你关于g++忽略
#pragma once
的纯幻想声明一样。剩下的,谈到用初学者的错误来破坏你不喜欢的功能,我觉得这很不令人信服。@Alf“它不工作”已经发生过不止一次,但我目前没有复制它所需的硬件。G++已经发展到像VC++一样对待
#pragma一次(过去不是这样的,在dis中有一次)