Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - costruttore copia di una classe autoriferente
Forum - C/C++ - costruttore copia di una classe autoriferente

Avatar
alfredo.liardo (Normal User)
Newbie


Messaggi: 2
Iscritto: 17/12/2014

Segnala al moderatore
Postato alle 12:06
Lunedì, 19/01/2015
Salve sto provando ad implementare una classe che astrae il concetto di nodo di un albero generico, il codice è questo:
Codice sorgente - presumibilmente C/C++

  1. template <class T>
  2. class Node
  3. {
  4.     public:
  5.         Node();
  6.         ~Node();
  7.         Node(const Node& other); //costruttore copia
  8.         Node& operator=(const Node& other);
  9.     protected:
  10.     private:
  11.         Node* parent;
  12.         Node* left , right;
  13.         T data;
  14. };


ma non so bene come implementare il costruttore copia, avevo pesato ad una cosa del genere:
Codice sorgente - presumibilmente C/C++

  1. Node copyNode = new Node();
  2.     copyNode.parent = other.parent;
  3.    copyNode.left = other.left;
  4.    copyNode.right = other.right;
  5.   copyNode.data = other.data;


Ma non sono sicuro che sia così per il fatto che non sono certo se si debba allocare un nuovo nodo oppure si debba allocare un nuovo nodo sia per parent sia per left sia per right.
Un aiuto?


Studente presso la facoltà di Scienze e Tecnologie inscritto al corso di Laurea di Informatica.
PM Quote
Avatar
Dario DF (Member)
Newbie


Messaggi: 19
Iscritto: 19/06/2013

Segnala al moderatore
Postato alle 12:32
Domenica, 15/02/2015
Dipende dall'uso che vuoi fare della copia. nel caso tu copiassi un nodo e richiamassi la copia anche per parent, left e right ti troveresti in una condizione di loop, in quanto il right, ad esempio, cercherebbe di copiare il parent finendo a riempire tutta la ram e non potendo completare la copia.

Se il nodo copia deve essere sostituibile a piacere ha senso copiare solo il nodo (chiaramente poi implica il fatto di dover cambiare il padre):

Codice sorgente - presumibilmente C/C++

  1. Node root = new Node();
  2.   root.right = new Node();
  3.   Node newRight = new Node(root.right);
  4.   // newRight è copia solo del nodo e non è associata a root.right
  5.   root.right = newRight; // Cambio il nodo vecchio con il nuovo nella struttura
  6.   // I figli sono gli stessi, quindi ho solo cambiato il nodo



Altrimenti il significato di copia "deep" potrebbe intendere la ricostruzione della parte di albero sottostante, ossia la copia è una vera copia di tutti i figli:

Codice sorgente - presumibilmente C/C++

  1. Node(const Node& other) {
  2.   this.parent = other.parent;
  3.   this.right = new Node(other.right);
  4.   this.left = new Node(other.left);
  5. }



A questo punto la copia consiste in un nuovo sottoalbero con radice uguale al nodo e permette utilizzi differenti al primo metodo:

Codice sorgente - presumibilmente C/C++

  1. Node root = new Node();
  2.   root.right = new Node();
  3.   root.left = new Node(root.right); // Copia la struttura di destra a sinistra (i figli di right e left sono effettivamente differenti)



Ho notato che, per esempio in jQuery, la funzione per clonare un nodo solitamente prevede due parametri, proprio per permettere entrambi i tipi di copia (anche se nel caso di copia normale si tende a rimuovere i nodi figli)

Codice sorgente - presumibilmente C/C++

  1. Node(const Node& other, bool deep);



Anche se il contesto e l'uso sono completamente differenti ti consiglio di guardare il concetto di copia presentato su http://api.jquery.com/clone/ :k:

PM Quote