Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c++][help-request] slicing e puntatori con classi derivate

    salve a tutti!

    ho cercato per due ore qualche chiarimento su un problema che ho, nel mio apprendimento "rapido" del C++, ovvero lo slicing su dei valori di ritorno. Anticipo che sto lavorando su liste ed alberi con dei programmi d'esempio che spero mi facciano capire bene come funzionano certe cose che nella mia attività di programmatore a livello più alto (o più basso, a seconda dei casi) avevo sempre trascurato.

    1. Innanzitutto ho due classi container "Lista" e la sua classe derivata "Albero". Poi ho due strutture dati: "Nodo" (che contiene appena un intero) e "Foglia" (che contiene qualche informazione in piu'). Come il nome suggerisce, per memorizzare i nodi ho creato una lista linkata singolarmente: ogni Nodo (e quindi ogni Foglia) contiene un puntatore al Nodo successivo.

    2. In Lista ho un metodo add(int i) che aggiunge un nodo. Tale metodo crea, al suo interno, un oggetto Nodo e lo aggiunge alla linked list che, effettivamente, è interna a Lista. Restituisce il puntatore a Nodo del nodo appena creato.

    NODO|pNodo--->NODO|pNodo---->NODO|pNodo

    3. In Albero ho un metodo add(int i, int colore) che è molto simile al precedente. Esso crea degli oggetti Foglia (che come ho gia' detto sono dei Nodo arricchiti) e restituisce un pNodo alla Foglia appena creata. Poiché Foglia è derivata da pNodo *CREDO* di poter usare un puntatore a Nodo anche per linkare le foglie...è giusto o così vado soggetto a slicing?

    FOGLIA|pNodo--->FOGLIA|pNodo--->...

    4. Inoltre, usando il metodo add(int) su Albero (diciamo che ci sono delle foglie senza colore) ottengo una lista "ibrida"

    FOGLIA!pNodo--->FOGLIA|pNodo--->NODO|pNodo--->FOGLIA|pNodo--->...

    che però non è quello che voglio...supponiamo infatti che voglia navigare l'albero per recuperare i colori di tutte le foglie...appena arrivo a NODO mi trovo un bel colore garbage. Attualmente ho definito add(int) di Lista come virtual e ho ridefinito add(int) anche per Albero in modo che allochi un FOGLIA non un NODO...ma è giusto così?
    Gabriele B. - http://9thcircle.it

  2. #2
    una struttura ad albero è una sequenza di nodi detti anche foglie. Non hai bisogno di strutture aggiuntive a parte quella che definisce il nodo.
    Se il tuo albero fosse binario la struttura dati sarebbe, semplificando

    codice:
    struct Node {
    
      Node * left;
      Node * right;
    
      void * data;
    
    };
    
    class Tree {
    
      Node * root ;
    
    public :
    
      Tree ();
      Tree ();  
    
    // funzioni di accesso, inserimento, modifica
    
    
    };

  3. #3
    ti ringrazio della risposta, tuttavia non mi _serve_ un albero...stavo solo facendo esperimenti sui puntatori e sullo slicing ecc.

    il fatto che li abbia chiamati alberi e foglia e' solo una coincidenza...avrei potuto chiamarli salami e mortadellle...

    il problema, quindi, rimane
    Gabriele B. - http://9thcircle.it

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    utilizzando il typeid di puntatori dichiarando virtuale il distruttore di nodo puoi confrontare 2 puntatore a nodo per sapere se sono effettivamente nodi o foglie es:

    codice:
    #include<typeinfo>
    
    NODO* nodo = new NODO(..);
    NODO* foglia = new FOGLIA(..);
    
    if(typeid(nodo) == typeid(foglia)) //senza usare il puntatore a foglia puoi usare typeid(FOGLIA*)
    {
       //è una foglia puntata da un puntatore a nodo
    }
    in questo modo puoi utilizzare dei nodi anche nell'albero magari non ritornando il colore o gestendo la cosa..

  5. #5
    OTTIMO!!

    Esattamente quello che cercavo! mille grazie di nuovo
    Gabriele B. - http://9thcircle.it

  6. #6
    devo fare qualche errore da qualche altra parte, evidentemente...non riesco a far girare qull'affare faccio qualche altro tentativo e poi posto eventuali altre richieste di chiarimenti...
    Gabriele B. - http://9thcircle.it

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 © 2026 vBulletin Solutions, Inc. All rights reserved.