Newsgroup: it.comp.lang.c++
Titolo: liste e costruttori default

Ho questo codice:
#include <iostream.h>
#include "ruota.h"
ruota::ruota(){
 primo=new ruota;
 primo->pun=0;
 primo->spicchio=1;
 primo->stato=0;
 cout<<"Elemento "<<primo<<" creato. Lo spicchio e' trasparente\n";
};
ruota::ruota(int n){
 int contatore=0;
 ruota* temp=0;
 while(contatore<n){
  primo=new ruota;
  pun=temp;
  temp=primo;
  contatore++;
  cout<<"Elemento "<<contatore<<" creato\n";
 };
};
perche' il costruttore di default non funziona? (nessun errore del
complilatore, del linker e neanche a tempo di esecuzione!)
#include <iostream.h>
#include "ruota.h"
void main(){
 ruota r1;
//dovrebbe creare una ruota formata da un elemento trasparente
//invece arresta l'esecuzione del programma (nessun errore)
 ruota r2(3);
//se nascondo il costruttore di default, ruota r2(3) mi restiruisce il
giusto output
aiuto.. non capisco perche'...
Marco
}

 void main(){
main deve restituire int, come gia` detto migliaia di volte.
Alle altre domande e` impossibile rispondere senza sapere cosa c'e` in
iostream.h e ruota.h e senza vedere la definizione di ruota.
Le liste dove sono?
        Mauro
 

         Mauro
grazie per la risposta,
Marco

 elemento della lista ovviamente puntera' a NULL.
E` un po' contorto.  "primo" punta all'ultimo che e` stato inserito o
a quello che sta in fondo alla lista?  Quando si aggiunge un elemento
si aggiornato tutti i puntatori "primo"?  Perche` se ogni elemento
punta al successivo, il primo punta a NULL e non al secondo?
Sei sicuro che non ti convenga avere una ruota semplice senza
puntatori e una lista (o vettore o altro) di ruote?
         Mauro

 puntatori e una lista (o vettore o altro) di ruote?
in realta' il costruttore/distruttore e le funzioni membro non operarano
sulla ruota ma sugli spicchi di cui essa e' composta. Probabilmente non sto
implementando nella maniera migliore il mio oggetto.
Comunque il mio dubbio rimane,
Marco

 };
Scusa ma nella linea che ti ho evidenziato crei una nuova ruota utilizzando
il costruttore di default che è proprio quello che stai definendo!!!!!!!!
Penso che in questo caso si crei una bella ricorsione! :-o


appunto! la penso anch'io cosi'.. tuttavia non capisco come mai anziche'
bloccarsi, il programma semplicemente termini...
ad ogni modo, hai una qualche idea per dichiare con il costruttore di
default una nuovo elemento ruota vuoto?
Marco

  primo=new ruota;
...questo mi puzza di ricorsione "all'infinito"...
dan

 giusto output
Anche se l'output e` giusto, quello che fa il costruttore mi
sembra meno giusto.
Durante il ciclo crea n nuovi oggetti (totale n+1), tutti con spicchio
e stato = 0.  Alla fine this->primo punta all'ultimo creato, this->pun
punta al penultimo, e i primi n-2 sono abbandonati senza possibilita`
di essere raggiunti (memory leak).  Tutti gli n oggetti extra hanno
primo=pun=0.
E` impossibile dare consigli su come risolvere i problemi di questi
costruttori senza sapere a cosa serve e cosa dovrebbe fare la ruota
(una lista che registra tutte le ruote del programma? una ruota che
contiene una lista di spicchi?)
Probabilmente ti conviene tenere sepatate ruote e liste, per esempio
puoi fare una classe ruota con solo stato e spicchio, e una
std::list<ruota> o altro contenitore.
         Mauro


si hai ragione. pensavo di creare due classi, una ruota e una spicchio...
oppure di annidare spicchio a ruota.
Ciao e grazie,
Marco

 sempre l'indirizzo dell'elemento successivo. Provare per credere...
Hai provato?
Ogni oggetto ha il suo primo, e l'unico primo che modifichi e` quello
dell'oggetto "originale".  Il primo degli n oggetti extra non punta a
niente.  Stessa cosa per pun.
Se non ci credi puoi provare a seguire la formazione delle strutture
con delle stampe intermedie o con un debugger (per esempio il ddd ha
un'ottima visualizzazione grafica delle strutture con puntatori).
       Mauro

 ha scritto nel messaggio
news:qCrVb.275786$_P.94...@news4.tin.it...

Io dividerei fra class Nodo e classe Lista, tipo "ruota" e "lista_ruote". In
questo modo nel costruttore di "lista_ruote" potrai preallocare una ruota
presente
di default in *tutte* le istanze di "lista_ruote".
ciao :->