scusate per la lunghezza ma ho usato il codice per simulare l'utilizzo che dovevo farne per accertarmi che tutto funzionasse perfetamente

(la faccina che ride è [faccine di merda])

a.h:
codice:
#ifndef _a
#define _a

#include "object.h"
#include "c.h"

class a : public object {
    public:
    a();
    
    void print();
    
    void set_b( object * );
    
    object *B;
};

#endif
a.cpp
codice:
#include "a.h"

a::a(){}

void a::print() {
    printf("a\n");
}

void a::set_b( object *ptr ) {
    B = ptr;
    ((b*)ptr)->print();
}
b.h
codice:
#ifndef _b_
#define _b_

#include "object.h"

#include "a.h"
#include "c.h"

class b : public object {
    
    public:
    b();
    
    void print();
    void set_a( object * );
    void set_c( object * );
    
    object *A;
    object *C;
};

#endif
b.cpp
codice:
#include "b.h"

b::b() {}

void b::print() {
    printf("protocol\n");
}

void b::set_c( object *ptr ) {
    C = ptr;
    ((c*)ptr)->print();
}

void b::set_a( object *ptr ) {
    A = ptr;
    ((a*)ptr)->print();
}
c.h
codice:
#ifndef _c_
#define _c_

#include "object.h"

#include "a.h"
#include "b.h"

struct c : public object {
    public:
    
    c();
    
    void print();
    void set_b( object * );
    void set_a( object * );
    
    object *A;
    object *B;
};

#endif
codice:
#include "c.h"

c::c(){}

void c::print() {
    printf("c\n");
}

void c::set_b( object *ptr ) {
    B = ptr;
    ((b*)ptr)->print();
}

void c::set_a( object *ptr ) {
    A = ptr;
    ((a*)ptr)->print();
}
object.h
codice:
#ifndef _object_
#define _object_

#include <stdio.h>

class object {};

#endif
main.cpp
codice:
#include "a.h"
#include "b.h"
#include "c.h"

int main() {
    a *A = new a();
    b *B = new b();
    c *C = new c();
    
    B->set_a(A);
    B->set_c(C);
}