Newsgroup: it.comp.lang.c++
Titolo: copia di strutture realizzate con classi

ciao a tutti,
ho creato una coda rappresentata tramite una struttura dinamica costituita
da record contenenti l'elemento "e" e il puntatore all'elemento
successivamente inserito. Ho definito una classe "Coda" che ha due variabili
private: "testa" e "coda" che puntano al primo e all'ultimo arrivato. La
classe implementa ovviamente i classici metodi pop, push, top...oltre
ovviamente al costruttore (inizializza testa=0) e il distruttore.
Nel main ho istanziato l'oggetto con: Coda c.
La domanda è: come faccio a creare una nuova coda identica a c, ossia che
abbia gli stessi elementi???
Per prima cosa devo definire il costruttore di copia, giusto?
Coda(const Coda& c){ testa=c.testa; coda=c.coda; }; //costruttore di copia
come proseguo per creare un "clone" della coda creata dall'utente???
ciao!

 abbia gli stessi elementi???
Dovresti usare un approccio di copia "deep" (copia elemento per elemento).
Ciao!
-- 
---
*************** | Have you ever retired a human by mystake?
*** Azathot *** |
*************** | To contact me, ask me gently. Thanks.

 Dovresti usare un approccio di copia "deep" (copia elemento per elemento).
cioè? fare un ciclo? ma così non mi ritrovo con gli elementi ordinati al
contrario???
ciao!

 contrario???
Dipende da come "visiti" la coda. Esempio, se scrivi qualcosa del tipo (in 
pseudo-C++):
void Coda::deep_copy( Element * _e ) {
        if ( _e->next )
                deep_copy( _e->next );
        Element * x = testa;
        testa = new Element( *_e );
        testa->next = x;
}
la coda mantiene il suo ordine...


 pseudo-C++):
c'ho capito poco. :-(( Cmq questo è il mio codice, ho implementato una
funzione ricorsiva che "dovrebbe" fare la copia elemento per elemento
sfruttando la funzione push...sicuramente ci saranno molti errori (non ho la
possibilità di provarla al momento...) fammi sapere:
CODADIN.h:
typedef int E;
struct Record{
       E el;
       Record* succ;
      };
typedef Record* Pr;
class Coda{
private:
  Pr testa;
  Pr coda;
public:
Coda();   // costruttore
Coda(const Coda& c){ testa=c.testa; coda=c.coda; }; //costruttore di copia
~Coda(); // distruttore
bool empty() const; // predicato coda vuota
bool full() const;   // predicato coda piena (sempre falso per
implementazione dinamica)
void push(const E el); // inserimento in coda
void pop(E& e);  // prelievo dalla testa
void top(E& e) const;  // ispezione senza rimozione dalla testa
void Coda::copy (Coda& c);
};
CODADIN.CPP:
//Funzione Push
void Coda::push(const E e){
     Pr p=new Record;
     p->el=e;
     if (testa==0)
        testa=p;
     else
         coda->succ=p;
     p->succ=0;
     coda=p;
}
//funzione ricorsiva Copia elemento per elemento
void Coda::copy (Coda& c){
   Pr p=testa;
   if (p->succ!=0){
      c1.push(p->el)
      testa=p->succ;
      }
   else copy(p->succ);
}
MAIN.cpp:
Coda c;
void inserimento(Coda& c){
  E e;
  cout<<"1)Inserimento di un elemento"<<endl;
  cout<<"Elemento:";
  cin>>e;
  c.push(e);
}
void copia(Coda& c){
  cout<<"3)Copia della coda elemento per elemento"<<endl;
  Coda c1;
  c1.copy(c);
}
ciao!

 }
??? Puoi scriverlo meglio (e, magari, commentarlo un attimo)?


 ??? Puoi scriverlo meglio (e, magari, commentarlo un attimo)?
Ho dei seri dubbi su questa funzione, ho sbagliato sicuramente la chiamata
ricorsiva. cmq l'ho commentata.
Mi da errore alla riga: c1.push(p->el) (55 codadin.cpp `c1' undeclared
(first use this function)
ed ancora errore alla riga: else copy(p->succ); "58 codadin.cpp  no matching
function for call to `Coda::copy (Record *&)'"
ecco il codice:
//funzione ricorsiva Copia elemento per elemento
void Coda::copy (Coda& c){
   Pr p=testa; //parto dalla testa
   if (p->succ!=0){ //se il puntatore all'elemento successivo non è nullo
      c1.push(p->el); //richiamo push passandogli l'elemento corrente
      testa=p->succ;  //sposto il puntatore all'elemento successivo
      }
   else copy(p->succ); //chiamata ricorsiva
}
ciao!