Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [c++]oggetto e *&

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]oggetto e *&

    ciao.
    ho la seguente funzione per semplificare:
    codice:
    void CStreamIn::ReadBaseObjecP(COpenObject*& pObject)
    {
    	COpenObject* pObj = new COpenObject();
    	pObject = pObj;
    }
    e questo è il chiamante:

    codice:
    pStreamIn->ReadBaseObjecP(p22);//p22 è un puntatore di un tipo derivato da COpenObject
    pStreamIn->ReadBaseObjecP(p23);//p23 è un puntatore di un tipo derivato da COpenObject
    mi dice che non è possibile convertire a COpenObject* per tutte e due le variabili.
    Non capisco perchè dato che con i seguenti parametri della funzione non mi da errore:
    codice:
    void CStreamIn::ReadBaseObjecP(COpenObject* pObject)
    {
    	COpenObject* pObj = new COpenObject();
    	pObject = pObj;
    }
    anche se in questo modo non riesco a "fare uscire" il puntatore valido dalla funzione, è per questo che ho pensato a *&.

    Dove sta il problema? come posso fare?
    grazie.

  2. #2

    Re: [c++]oggetto e *&

    Originariamente inviato da giuseppe500
    ciao.
    ho la seguente funzione per semplificare:
    codice:
    void CStreamIn::ReadBaseObjecP(COpenObject*& pObject)
    {
    	COpenObject* pObj = new COpenObject();
    	pObject = pObj;
    }
    e questo è il chiamante:

    codice:
    pStreamIn->ReadBaseObjecP(p22);//p22 è un puntatore di un tipo derivato da COpenObject
    pStreamIn->ReadBaseObjecP(p23);//p23 è un puntatore di un tipo derivato da COpenObject
    mi dice che non è possibile convertire a COpenObject* per tutte e due le variabili.
    Non capisco perchè dato che con i seguenti parametri della funzione non mi da errore:
    codice:
    void CStreamIn::ReadBaseObjecP(COpenObject* pObject)
    {
    	COpenObject* pObj = new COpenObject();
    	pObject = pObj;
    }
    anche se in questo modo non riesco a "fare uscire" il puntatore valido dalla funzione, è per questo che ho pensato a *&.

    Dove sta il problema? come posso fare?
    grazie.
    considera che non te lo compilerebbe neppure così:
    codice:
    void CStreamIn::ReadBaseObjecP(COpenObject**pObject);
    pStreamIn->ReadBaseObjecP(&p22);//p22 è un puntatore di un tipo derivato da
    essenzialmente ciò che stai cercando di fare è semanticamente senza senso ;-)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.