I know that similar questions to this have been asked before but after doing my research I still have questions about circular header includes.
//FooA.h
#ifndef H_FOOA
#define H_FOOA
#include "foob.h"
class FooA{
public:
FooB *fooB;
};
//FooB.h
#ifndef H_FOOB
#define H_FOOB
class FooA;
class FooB{
public:
FooA *fooA;
};
Now if I have two circular dependencies this is the way that I have seen people on stackoverflow get around the problem. My only problem with this is that in my main.cpp I must include fooa.h first and then foob.h
//main.cpp the right way
#include "fooa.h"
#include "foob.h"
//main.cpp that will surely get a compile error
#include "foob.h"
#include "fooa.h"
Now my question is "Is there a way to forward declare these classes in a way that will allow me to not care about the order in which I include the header files in my main.cpp?"
Is there a way to forward declare these classes in a way that will allow me to not care about the order in which I include the header files in my main.cpp?
since you are dealing with simple pointers only, you can use a forward declaration here in both cases:
FooA.h
#ifndef H_FOOA
#define H_FOOA
// #include "foob.h" << not needed!
class FooB; // << substitute with a forward declaration of FooB
class FooA{
public:
FooB *fooB;
};
#endif
FooB.h
#ifndef H_FOOB
#define H_FOOB
class FooA;
class FooB{
public:
FooA *fooA;
};
#endif
You don't have to care about the order because fooa.h
includes foob.h
, and foob.h
has the forward declaration for FooA
. Everything is correct already in your code.
As both classes simply contain a pointer, you don't need to include the other header. A forward declaration will do.
Any code that actually uses the other class will need the header, but that should be in a cpp file.
Use a forward declare in both header files.
Did you know you can declare it on the same line?
In "FooB.h"
class FooB{
public:
class FooA *fooA;
};
In "FooA.h"
class FooA {
public:
class FooB *fooB;
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With