C++ (Qt)void A::DoSomething( void ){ .. if (mData != NULL) // mData "вообще нет" или "пока нет"? :-) ..}
C++ (Qt)class A {... int mIndexIO; // да, это поле только для IO, но иначе еще дороже B * mData;};
C++ (Qt)for (size_t i = 0; i < container_A.size(); ++i) container_A[i]->ResolveLinks();
C++ (Qt) int mIndexIO; // да, это поле только для IO, но иначе еще дороже};
C++ (Qt)void saveObjectA( ostream &os, const A &obj, const Coll<B*> collB ){ os << obj.data1 << obj.data2 << ...; os << collB.ptrToIndex( obj.ptrB );}
C++ (Qt)void saveObjectA( ostream &os, const A &obj, const Coll<B*> collB )
C++ (Qt)template <class T>const Coll<T *> & GetCollOfType( const T & );
C++ (Qt)// Функция верхнего уровня для загрузки данныхbool loadFile( ... ){ ifstream is; ... int version; is >> version; int numObjA; is >> numObjA; std::deque<ClassA *> collA( numObjA ); std::deque<int> idxCollA( numObjA ); for( int i = 0; i < numObjA; ++i ) { int idx; ClassA *o = new ClassA; readObjectA( is, o, idx ); collA[ i ] = o; idxCollA[ i ] = idx; } int numObjB; is >> numObjB; std::deque<ClassB *> collB( numObjB ); for( int i = 0; i < numObjB; ++i ) { ClassB *o = new ClassB; readObjectB( is, o, collA ); // Здесь мы уже можем резолвить указатели на объекты из контейнера А collA[ i ] = o; } // Резолвим индексы объектов из контейнера А. for( int i = 0; i < numObjA; ++i ) { collA[ i ]->ptrB = collB[ idxCollA[ i ] ]; }} void readObjectA( istream &is, A &obj, int &idx ){ is >> obj.data1 >> obj.data2 >> ...; is >> idx; // Читаем индекс объекта для связи в контейнере B.}