boom
boom

Reputation: 6166

Multiple inclusion of header file 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?

Upvotes: 8

Views: 22713

Answers (4)

Dattatraya Mengudale
Dattatraya Mengudale

Reputation: 336

Here the simple way to avoid multiple header inclusion in the project.

//MYCLASS.h
#ifndef MYCLASS_H_
#define MYCLASS_H_

class CMyClass
{
public:
    CMyClass();
}

#endif //MYCLASS_H_

Upvotes: -2

santhosh
santhosh

Reputation: 385

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

Upvotes: 3

Eli Bendersky
Eli Bendersky

Reputation: 273844

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.

Upvotes: 11

GManNickG
GManNickG

Reputation: 504313

You use what are called include guards or header guards. They go something like this:

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

// stuff goes here

#endif

Essentially, the first time around the macro hasn't been defined so everything inside is included. However, after the first time subsequent includes will have no effect.

The naming scheme, like all naming schemes, is completely arbitrary and up to you. I like to include the file name as a minimum, as I did above, in that fashion. I also include namespaces and project names in my real projects.

There are a couple of things to watch out for. You might be tempted to do things like this:

#define _SOME_HEADER_H__

To obfuscate it a bit. However, names that begin with an underscore followed by a capital letter, or contain double-underscores are reserved identifiers, and you cannot use them.

Upvotes: 2

Related Questions