К сожалению, во всех предыдущих ответах отсутствуют некоторые детали. Правильное решение немного обременительно, но это единственный способ сделать это правильно. И он легко масштабируется, обрабатывает и более сложные зависимости.
Вот как вы можете это сделать, точно сохранив все детали и удобство использования:
- решение точно такое же, как первоначально предполагалось
- встроенные функции по-прежнему встроены
- пользователи
A
и B
могут включать A.h и B.h в любом порядке
Создайте два файла, A_def.h, B_def.h. Они будут содержать только определения A
и B
:
// A_def.h
#ifndef A_DEF_H
#define A_DEF_H
class B;
class A
{
int _val;
B *_b;
public:
A(int val);
void SetB(B *b);
void Print();
};
#endif
// B_def.h
#ifndef B_DEF_H
#define B_DEF_H
class A;
class B
{
double _val;
A* _a;
public:
B(double val);
void SetA(A *a);
void Print();
};
#endif
И тогда А.х и Б.ч будут содержать это:
// A.h
#ifndef A_H
#define A_H
#include "A_def.h"
#include "B_def.h"
inline A::A(int val) :_val(val)
{
}
inline void A::SetB(B *b)
{
_b = b;
_b->Print();
}
inline void A::Print()
{
cout<<"Type:A val="<<_val<<endl;
}
#endif
// B.h
#ifndef B_H
#define B_H
#include "A_def.h"
#include "B_def.h"
inline B::B(double val) :_val(val)
{
}
inline void B::SetA(A *a)
{
_a = a;
_a->Print();
}
inline void B::Print()
{
cout<<"Type:B val="<<_val<<endl;
}
#endif
Обратите внимание, что A_def.h и B_def.h являются "частными" заголовками, пользователи A
и B
не должны их использовать. Общедоступным заголовком является A.h и B.h.