Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple inclusion of header file c++

Tags:

c++

I have a problem regarding multiple inclusion of header file in C++ code.

Say for example, I have three classes X, Y, Z. X and Y are derived from base class Z. And I want to create an instance of X in Y. The code will go like this.

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…
};

So in this multiple definition of all methods of base class arises. How can I cope with this problem?

like image 665
boom Avatar asked May 14 '10 05:05

boom


2 Answers

Using "include guards" (Wikipedia link)

#ifndef MYHEADER_H
#define MYHEADER_H

// header file contents go here...

#endif // MYHEADER_H

This is idiomatic code, easily recognizable by any seasoned C and C++ programmer. Change MYHEADER_H to something specific to you, for example if the header defines a class named CustomerAccount, you can call the guard CUSTOMERACCOUNT_H.


In your specific case, have a separate header/source file for each class. The header file for the Z class will have an include guard:

#ifndef Z_H
#define Z_H

// Code of Z class

#endif Z_H

Now, the headers of both X and Y can include z.h safely - it will only really be included once in a .cpp file that includes both x.h and y.h and no duplication will occur.

Always keep in mind that in C and C++ what's really gets compiled are the source (.c or .cpp) files, not the header files. The header files are just "copy-pasted" by the preprocessor into the sources files that include them.

like image 60
Eli Bendersky Avatar answered Oct 05 '22 21:10

Eli Bendersky


You can also use #pragma once preprocessor directive in your header files. (There's no need to bother about #ifndef, #define, #endif).

like image 38
santhosh Avatar answered Oct 05 '22 20:10

santhosh