Если делать в общем виде, то может так
C++ (Qt)
struct CDescriptorIO {
size_t mIndex; // индекс
int mType; // тип (для полиморфных)
};
void readObjectA( istream &is, A &obj, vector <CDescriptorIO> & desc )
{
is >> obj.data1 >> obj.data2 >> ...;
desc.clear();
desc.push_back(CDescriptorIO());
is >> desc.back().mIndex;
..
}
А при resolve объект опять получает вектор который сам заполнил и может восстановить указатели. Можно добавить в дескриптор и указатель на объект который заполнит пресловутый посредник. Возможна и более вызывающая реализация
C++ (Qt)
size_t temp;
is >> temp;
obj.mPtrB = (B *) temp;
Без доп полей.
В классе А куча всего, чего ему знать не надо, но вы его усиленно пытаетесь этому научить. Он у вас завязан на все коллекции, на все классы... Это конечно хуже одного посредника.
Неубедительно. Если A держит указатель на B, значит хедер B он уже видит - не вижу какие новые зависимости возникают