2010-05-14 91 views
5

我有一个关于在C++代码中包含多头文件的问题。头文件C++的多个包含文件

说例如,我有三个类,X,Y,Z。 X和Y是从基类Z中派生出来的。我想在Y中创建一个X的实例。代码将如下所示。

class Z{some code} 

class X:public Z{some code};//here #include header of class Z added 

class Y:public Z //here #include header of class Z added as well as of X class 

{private: 
    X* mX;//instance of X 

some code}; 

所以在这个基类的所有方法的多重定义出现。我如何应付这个问题

+0

可能重复的[重定义c + +](http://stackoverflow.com/questions/2823330/redefinition-c) – 2010-05-14 05:46:26

回答

8

使用“包括卫士”(Wikipedia link

#ifndef MYHEADER_H 
#define MYHEADER_H 

// header file contents go here... 

#endif // MYHEADER_H 

这是惯用的代码,由经验丰富的任何C和C++程序员容易辨认。将MYHEADER_H更改为特定的内容,例如,如果标题定义了一个名为CustomerAccount的类,则可以调用警卫CUSTOMERACCOUNT_H


在您的具体情况下,请为每个类分别创建一个头文件/源文件。用于Z类的头文件将有一个包括后卫:

#ifndef Z_H 
#define Z_H 

// Code of Z class 

#endif Z_H 

现在,无论是X的头和Y可以包括z.h安全 - 它只会真正的.cpp文件包括x.h并计入一次y.h并且不会发生重复。

请务必记住,在C和C++中真正编译的是源文件(.c或.cpp),而不是头文件。头文件只是由预处理器“复制粘贴”到include这些源文件中。

+0

你可以请更具体的我的例子如果你不介意。 – boom 2010-05-14 05:40:35

+0

@iSight:已更新。这够了吗? – 2010-05-14 05:48:50

+0

很多很多thanx。它解决了。 – boom 2010-05-14 06:05:20

1

您可以使用所谓的包括守卫或标头警卫。他们走这样的事情:

// within some_header.h 
#ifndef SOME_HEADER_H 
#define SOME_HEADER_H 

// stuff goes here 

#endif 

本质上,第一次围绕宏没有被定义,所以里面的一切都包括在内。但是,第一次后续包含将不起作用。

与所有命名方案一样,命名方案完全是任意的,由您决定。我喜欢以这种方式将文件名至少包含在内,就像我上面所做的那样。我还在我的真实项目中包含名称空间和项目名称。

有几件事值得注意。你可能会试图做这样的事情:

#define _SOME_HEADER_H__ 

混淆它一下。但是,以下划线开头,后跟大写字母或包含双下划线的名称是保留的标识符,并且您不能使用它们。

3

您还可以使用#pragma一次预处理器指令在头文件中。 (不需要打扰#ifndef #define #endif)

+0

在基类头或派生类头中使用此指令的位置。 – boom 2010-05-14 11:49:36

+0

@iSight需要定义所有(基类和派生)类头文件 – santhosh 2010-05-15 12:17:09

+0

+1 #pragma一次 – hyde 2013-07-20 08:49:47