Вы определенно можете использовать что-то вроде:
class A;
class B {
A* the_a;
}
вместо
class B {
void* the_a;
}
в вашем коде C ++, и первый код лучше, чем второй. Тем не менее, не спешите использовать сырые указатели, если только вам это не нужно.
Наконец, я настоятельно рекомендую вам избегать типов указателей typedef, используя имена, которые не ясно указывают на тип указателя, так как это сбивает с толку (и бесполезно).