Acá puedes usar el concepto de "friends" (https://isocpp.org/wiki/faq/friends)
Una cosa espantosa puede ser algo así...
Código
#include <iostream> //ClaseB class ClaseB { friend class ClaseA; public: void Beta(class ClaseA* a); }; //ClaseA class ClaseA { private: ClaseB* b; bool hecho = false; friend class ClaseB; // https://isocpp.org/wiki/faq/friends public: ClaseA() : b{ new ClaseB } {} ~ClaseA() { delete b; } void Alpha(); }; //ClaseA fuente void ClaseA::Alpha() { //hacer algo if (hecho) return; b->Beta(this); //invoco a ClaseB::Beta() std::cout << "Alpha"; hecho = true; } //ClaseB fuente void ClaseB::Beta(class ClaseA* a) { //el hilo proveniente de ClaseA::Alpha pasa por aqui... //hacer algo //invocar de vuelta a ClaseA::Alpha() desde un principio... if (a->hecho) return; a->hecho = true; std::cout << "Beta"; a->Alpha(); } // Lo que busco hacer es llamar desde ClaseA::Alpha() a ClaseB::Beta(), luego ClaseB::Beta() debe invocar a ClaseA::Alpha() de vuelta. int main() { ClaseA a; a.Alpha(); }