In casi simili non c'è altro modo se non ricorrere alla forward reference e un puntatore. Infatti il compilatore sa com'è fatto un puntatore, ma non com'è definita la classe del puntatore.
Perché funzioni il tutto è indispensabile che nelle dichiarazioni delle classi (o nell'header file in generale) non si faccia riferimento ai campi (metodi o variabili) della classe incompleta.
Non serve nemmeno fare un giro strano di include, ma è sufficiente usare la forward reference.
Gli include necessari dovranno però essere inseriti nei file rispettivi file.cpp prima che metodi o variabili della classe in forward reference siano usati.
file A.h
codice:
class B; // forward reference
class A {
static B* punt;
};
file B.h
codice:
class A; // forward reference
class B {
funzione1(A*...);
funzione2(A*...);
};
file A.cpp
codice:
#include "A.h"
#include "B.h"
// ora il compilatore sa com'è fatta sia A sia B
// sviluppo funzioni etc.
B* A::punt = nullptr;
file B.cpp
codice:
#include "B.h"
#include "A.h"
// ora il compilatore sa com'è fatta sia A sia B
// sviluppo funzioni etc.
B::funzione1(A* arg) {
arg->metodo_strano();
}