ciao MacApp.
Mi volevo spiegre meglio, nulla toglie al tuo(corretto) discorso precedente in cui avevo esposto molto male cio che volevo dire.
Quello che voglio fare è assegnare un indirizzo raw ad un puntatore tramite una funzione.
Il problema principale è che se nella mia classe dichiaro un puntatore membro per es:
codice:
class classe1
{
.
.
.
DataClass * pPointer1;
};
questo puo' avere un valore bad pointer(forse sbaglio) o NULL se lo inizializzo.
Va da se che non posso assegnare nulla ad un indirizzo NULL.
Se uso gli smart pointer il discorso cambia:
Ho infatti un wrapper attorno ad un puntatore che puo' "Portare fuori il suo membro interno (il puntatore grezzo dopo averlo assegnato) "
Sto cercando di utilizzare un procedimento di deserializzazione dei puntatori membro (il discorso vale per qualunque deserializzazione usata qt o altre librerie)
per es: questa funzione assegna un id al contenuto dello smart pointer nella fase di load.
Ho infatti una fase di load che assegna gli id ai puntatori e una fase di linking che assegna l'oggetto corrispondente all' id prelevandolo da una mappa, creata nella fase di loading.
Gli id vengono scritti nel file di serializzazione ad in un punto preciso in modo che possano essere ritrovati in fase di load.
codice:
template< class T >
void ReadBaseObjecP(shared_ptr<T>& pObject)
{
unsigned int ID;
m_buffer.Read<unsigned int>(&ID);
unsigned int* data = reinterpret_cast<unsigned int*>(&pObject);
*data = ID;
m_mapTranscode.insert(pair<COpenObject*,unsigned int>(pObject.get(), ID));
}
Ho usato una funzione template in cui specifico il tipo per il cast nella mia classe avro' questo:
codice:
pStreamIn->ReadBaseObjecP<Ctest2Ser>(p22);//p22 e p23 sono smart pointer della classe ctest2ser
pStreamIn->ReadBaseObjecP<Ctest2Ser>(p23);
l'id viene letto dallo streaming sytem ed è un identificativo in un altra mappa m_mapTranscode
che punta all'oggetto deserializzato che deve essere assegnato a questo puntatore
codice:
void Link(shared_ptr<T>& pObject)
{
unsigned int ID;
if( m_mapTranscode.find(pObject.get()) != m_mapTranscode.end())
ID = m_mapTranscode.find(pObject.get())->second;
COpenObject* pObj = m_MapLink.find(ID)->second;
pObject = shared_ptr<T>((T*)pObj);
}
cosi sono riuscito a deserializzare e linkare i puntatori membro.
Il problema è che utilizzo degli smart pointer.
Il fatto è che a volte devo poter deserializzare/linkare dei puntatori grezzi, ad es se ho dei riferimenti circolari(il classico esempio è un oggetto nodo in un grafo che ha un parent anche lui nodo, se uso solo smart pointer ho il riferimento circolare)
Mi chiedevo se potessi creare una classe wrapper(creata da me) attorno ad un puntatore senza pero il reference counter e se fosse possibile trovare un modo per creare quel wrapper al passsaggio dei parametri e restituire al puntatore il contenuto del wrapper.
grazie.