This may or may not be what you're looking for, but this is the generic way of decoupling too classes, applied to the definitions you provided:
class IMainClass {
public:
virtual int fun1()=0;
virtual int fun2()=0;
virtual int fun3()=0;
static IMainClass* getInstance();
};
#include "IMainClass.h"
class MainClass : public IMainClass{
public:
virtual int fun1();
virtual int fun2();
virtual int fun3();
static MainClass* mainClass;
};
#include "IMainClass.h"
#include "MainClass.h"
IMainClass* IMainClass::getInstance() {
if (MainClass::mainClass == 0)
MainClass::mainClass = new MainClass;
return MainClass::mainClass;
}
#include "MainClass.h"
#include "IHelperClass.h" // only include the interface!
MainClass* MainClass::mainClass = 0; int MainClass::fun1()
{
}
...
class IHelperClass {
public:
virtual int helperfun1()=0;
virtual int helperfun2()=0;
static IHelperClass* getHelper();
};
#include "IHelperClass.h"
class HelperClass : public IHelperClass {
virtual int helperfun1();
virtual int helperfun2();
};
#include "IHelperClass.h"
#include "HelperClass.h"
IHelperClass* IHelperClass::getHelper() {
return new HelperClass;
}
#include "HelperClass.h"
#include "IMainClass.h" // only include the interface!
...
Note how I split up both classes into an interface and an implementation. From MainClass you can now reference all the functionality of HelperClass through the interface alone, so you only need to include IHelperClass.h, not HelperClass.h. Similarly, the Helperclass implementation can access all functionality from MainClass via its interface IMainClass and only needs to include IMainClass.h.
I introduced get-functions to give access to actual objects of type HelperClass and MainClass without needing the implementation class declarations.