Harold Serrano

View Original

How to use Forward Declaration in C++

Imagine that you have two classes: MyClassA and MyClassB. Both of these classes have their respective .h and .cpp file. Imagine you need to reference MyClassA in MyClassB, do you know where you should use

#include "MyClassA.h"

and where to use

class MyClassA

in the files of MyClassB?

For example, the code below shows that I'm using

#include "MyClassA.h"

in both header and implementation files of MyClassB:

//This is the header file: MyClassB.h
#include "MyClassA.h" //Including file for MyClassA    

class B{
    public:
        B(){}
        ~B(){};
        //...
}

//This is the implementation file: MyClassB.cpp

#include "MyClassA.h" //Again, including file for MyClassA

//B's methods implementations goes here...

The question is, is this correct?

Simple answer: The implementation file (.cpp) of MyClassB will always need:

#include "MyClassA.h"

However, the header file (.h) of MyClassB does not necessarily need

#include "MyClassA.h"

For example, in the above example, you can replace #include with a forward declaration:

class MyClassA;  //This is a Forward Declaration 

For example:

//This is the header file of class B
class MyClassA; //This is forward declaration   

class B{
    public:
        B(){}
        ~B(){};
        //...
    }

The question is when do you use

#include "MyClassA.h"

vs.

class MyClassA;

I am not a C++ expert, but these are the tips I always keep in mind:

If you are going to invoke the constructor, copy constructor or any method of MyClassA in the header file of MyClassB, then you need to use #include "MyClassA.h".

This is because the compiler needs to know how to create the object or methods belonging to MyClassA. For example:

//This is the header file of class B
#include "MyClassA.h" //Including file for MyClassA    

class B{
    private:
        MyClassA myClass; //You are invoking a constructor of MyClassA

    public:
        B(){}
        ~B(){};

        inline void print(MyClassA myClass){ myClass->print();}; //You are invoking a copy constructor and a method of MyClassA
}

However,

if you have a pointer to MyClassA in MyClassB.h or passing MyClassA by reference in a method argurment, you can simply use the forward declaration instead.

For example:

//This is the header file of class B
class MyClassA; //This is forward declaration    

  class B{
      private:
          MyClassA *myClass; //pointer to MyClassA
      public:
        B(){}
        ~B(){};

        void print(MyClassA* myClass); //Passing by reference. Not calling any methods of MyClassA.
}

So, there you have it. Use #include "MyClassA.h" in the header file of MyClassB.h whenever you will be invoking the constructor or any method of MyClassA. If you are not, you can simply use a forward declaration in the header file of MyClassB.h.

PS. Sign up to my newsletter and get development tips