Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]conversione smart pointers

    ciao.
    Ho una funzione che mi ritorna la copia di un oggetto derivato da una classe base Object:

    codice:
    Spatial* pS =<.....>
    ObjectPtr sp = pS->Copy();
    pS = (Spatial*)sp;
    (i vari ObjectPtr , SpatialPtr sono smart pointer)
    quando tento di riconvertirla nella classe derivata con un cast(Spatial*) mi da errore , questo:
    Error 2 error C2440: 'type cast' : cannot convert from 'Wm4::ObjectPtr' to 'Wm4::Spatial *' c:\programmazione\wild magic 4\geometrictools\wildmagic4\samplegraphics\materia ltextures\materialtextures.cpp 199


    non so come fare , forse bisogna usare il dynamic cast?
    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Stai tentando di convertire un oggetto in un puntatore, ovvio che ti dia errore.
    Per curiosità, da dove hai tirato fuori questi wm4:bjectptr?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ciao shodan, sono degli smart pointer di un engine 3d(wild magic 4).
    ho risolto cosi':
    codice:
            Spatial* pS = pkObj->GetChild(0);
    	ObjectPtr sp = pS->Copy(true);
    	pS = DynamicCast<Spatial>(sp);
    ma non ho capito bene se sia nwecessario il DynamicCast.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il dynamic_cast si usa quando è necessario convertire un puntatore da classe base in puntatore a classe derivata. Se il compilatore non ha abbastanza informazioni per risolvere a compile time un cast diverso, ad esempio in presenza di ereditarietà multipla da più classi, a diamante oppure virtuale, il dynamic_cast è obbligato. (Ovviamente serve almeno un metodo virtuale, di solito il distruttore.) Da notare che in quelle situazioni, nemmeno il brutal_cast del C può fare qualcosa.

    Da quello che vedo, quelli sono smart pointer di tipo intrusivo che fanno un cast dalla classe Object in giù. Se le tue classi hanno solo un ramo di derivazione (quindi non ereditano da più classi), probabilmente puoi usare anche lo StaticCast (che però non ti da garanzia che il puntatore ottenuto sia effettivamente valido).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    si , shodan hai capito bene , sono smart pointers di tipo intrusivo , tutte le classi nell'engine derivano da Object e quindi hanno implementazioni comuni , tra cui la funzione di smart pointer ed altre come la serializzazioone ecc...
    Quello che ti volevo chiedere(a scopo informativo)è se è possibile e utile non derivare tutte le classi da una classe base ,cosi come ho letto in alcuni libri, ed utilizzare invece i template.
    Da quello che posso capire il non derivare per forza da una classe base permette piu' libertà nelle derivazioni.
    scusa ma sono un profano , chiedo a te.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si, è possibile. Il C++ non ha necessità di derivare da una sola classe base (sia pure con solo distruttore virtuale), però l'utilità dipende sempre da contesto e specifiche di progetto.
    Se non ricordo male, tempo fa avevi chiesto per una template factory. Quello è un buon esempio di come usare un template per creare diverse factory concrete, senza che ci sia una classe base comune per tutto quanto.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.