Since the down of time mankind seek the solution to the circular dependencies in C++. Well – may be ot exactly since the “down of time” and definitly not the whole of the mankind – but it have been “always” a problem.
Traditional solution was to forward-declarate it:
class A;
class B
{
public:
B(A *) {}
};
class A
{
static B b;
};
However it have its limitations. For example B cannot call A methods making such solutions useless. Other solution is spliting functions and class declaration – however it may cause problems if they will not match (for example some functions remain undefined):
class A;
class A
{
static B b;
public:
void doIt();
};
class B
{
public:
B(A *);
void doSomething();
};
void A::doIt()
{
b.doSomething();
}
B::B(A *a)
{
if(a != NULL)
a->doit();
}
void B::doSomething()
{
}
There is solution, at least working on gcc 4.4. Let’s define B as a template:
template
class B
{
public:
B(A *a)
{
if(a != NULL)
a->doit();
}
void doSomething() {}
};
class A
{
static B b;
public:
void doit()
{
b.doSomething();
}
};
Probably we consider writing each time <![CDATA[B]]> waste of space. We can simply forward-declare class and set the default arguments:
class A;
template
class B
{
public:
B(A *a)
{
if(a != NULL)
a->doit();
}
void doSomething() {}
};
class A
{
static B b;
public:
void doit()
{
b.doSomething();
}
};