Problema con overloading <<

di il
3 risposte

Problema con overloading <<

Salve a tutti, come da titolo ho un piccolo problemino con overloading del operatore << in pratica funziona una volta e poi non fa stampare più nulla
 
  #include <iostream>

using namespace std;

class nodo {

private:
string nome;
int hp;
int attacco; 
nodo * next; 

public:
nodo(string a,int b,int c) : nome(a),hp(b),attacco(c),next(NULL){ }
nodo() : nome("undefined"),hp(0),attacco(0),next(NULL){ }

string get_nome();
int get_hp();
int get_attacco();
nodo* get_nodo();
void set_nome(string x);
void set_hp(int x);
void set_attacco(int x);


friend ostream& operator<<(ostream& os,const nodo &x){
os << x.nome << endl;
os << x.hp << endl;
os << x.attacco << endl;  
return os; }

friend class lista;
};

string nodo::get_nome()
{ return nome;  }

int nodo::get_hp()
{ return hp; }

int nodo::get_attacco()
{ return attacco; }

nodo* nodo::get_nodo()
{ return next; }

void nodo::set_nome(string x)
{ nome = x; }

void nodo::set_hp(int x)
{ hp = x; }

void nodo::set_attacco(int x)
{ attacco = x; }

/*void nodo::stampa(){
cout << nome << endl;
cout << hp << endl;
cout << attacco << endl; }*/

class lista { 

private:
nodo* inizio;
nodo* fine; 

public:
lista(){ inizio = fine = NULL; }
~lista(){ delete_list(); }

 

nodo* front() const;
nodo* back() const; 
void pushback(string,int,int);
void popfront();
void delete_list();
void stampa();

friend ostream& operator<<(ostream& os, const lista x){
nodo * scorri = x.front();

if(scorri == NULL)
os << "la lista è vuota" << endl; 

for(;scorri != NULL;scorri = scorri->get_nodo() )
os << *scorri; 

return os; }



};

nodo* lista::front() const
{ return inizio; }

nodo* lista::back() const
{ return fine; }

void lista::pushback(string a,int b,int c){

nodo* nuovo = new nodo(a,b,c);

if(fine == NULL)
inizio = fine = nuovo; 

else {
fine->next = nuovo;
fine = nuovo; }}

void lista::stampa(){
nodo * scorri = inizio;

while(scorri != NULL){
cout << *scorri;
scorri = scorri-> next; }}

void lista::popfront(){

if(inizio == NULL)
return;

nodo * scorri = inizio;
inizio = inizio->next;
delete scorri;  

if(inizio == NULL)
fine = NULL;  }

void lista::delete_list(){
nodo * scorri = inizio;
nodo * pre = scorri;

while(pre != NULL){
pre = scorri;
delete pre; //possibile spos.
if(scorri != NULL)
scorri = scorri->next; }

inizio = fine = NULL; }






int main(){

lista uno;

cout << "prima stampa" << endl;
uno.pushback("primo",500,210);
uno.pushback("secondo",340,110);
uno.pushback("terzo",220,250);
cout << uno;
//uno.stampa();

cout << "elimina il primo" << endl;
uno.popfront();
//cout << uno;
uno.stampa();

cout << "aggiungi quarto" << endl;
uno.pushback("quarto",444,888);
//cout << uno;
uno.stampa();

cout << "cancella la lista" << endl;
uno.delete_list();
//cout << uno;
uno.stampa();

cout << "aggiungi 5 & 6" << endl;
uno.pushback("quinto",544,333);
uno.pushback("sesto",344,777);
//cout << uno;
uno.stampa();


   
}
 

3 Risposte

  • Re: Problema con overloading <<

    Il problema è in delete_list, controlla bene che fa quello che vuoi veramente. Correggimi se sbaglio, tu stai cercando di implementare una LinkedList giusto ? Se fossi cosi penso che sia meglio spostare nodo all'interno di lista, perché nodo fa parte dei dettagli di implementazione di lista non è una cosa che chi usa lista dovrebbe vedere. Oltre a questo ti consiglierei a dare nomi più descrittivi, per esempio la funziona get_nodo all'interno della classe nodo non fa quello che dice il nome, ma ritorna il prossimo nodo. Oltre a quello definisci le funzioni all'interno della classe soltanto quando vuoi che queste funzioni solo inlined.
  • Re: Problema con overloading <<

    Grazie della risposta si sto cercando di implementare una linkedlist e ho risolto il problema con operatore << ma adesso ho dei problemi con il distruttore in cui metto la funzione delete (che ho rivisto) che rilascia array creato dinamicamente però ho notato che il programma lo richiama molte volte durante l'esecuzione, dovrebbe richiamarlo solo quando esce dallo scope o quando il programma termina
    
    #include <iostream>
    
    using namespace std;
    
    class nodo {
    
    private:
    string nome;
    int hp;
    int attacco; 
    nodo * next; 
    
    public:
    nodo(string a,int b,int c) : nome(a),hp(b),attacco(c),next(NULL){ }
    nodo() : nome("undefined"),hp(99),attacco(0),next(NULL){ }
    
    string get_nome();
    int get_hp();
    int get_attacco();
    nodo* nodo_next();
    void set_nome(string x);
    void set_hp(int x);
    void set_attacco(int x);
    
    
    friend ostream& operator<<(ostream& os,const nodo &x){
    os << x.nome << endl;
    os << x.hp << endl;
    os << x.attacco << endl;  
    return os; }
    
    friend class lista;
    };
    
    class lista { 
    
    private:
    nodo* inizio;
    nodo* fine; 
    
    public:
    lista(){ inizio = fine = NULL; }
    ~lista(){ delete_list(); }
    
     
    
    nodo* front() const;
    nodo* back() const; 
    void pushback(string,int,int);
    void popfront();
    void delete_list();
    void stampa();
    
    friend ostream& operator<<(ostream& os, const lista x){
    nodo * scorri = x.front();
    
    if(scorri == NULL)
    os << "la lista è vuota" << endl; 
    
    while(scorri != NULL){
    os << *scorri;
    scorri = scorri->nodo_next(); }
    
    return os; }
    
    
    
    };
    
    nodo* lista::front() const
    { return inizio; }
    
    nodo* lista::back() const
    { return fine; }
    
    void lista::pushback(string a,int b,int c){
    
    nodo* nuovo = new nodo(a,b,c);
    
    if(fine == NULL)
    inizio = fine = nuovo; 
    
    else {
    fine->next = nuovo;
    fine = nuovo; }}
    
    void lista::stampa(){
    nodo * scorri = inizio;
    
    while(scorri != NULL){
    cout << *scorri;
    scorri = scorri-> next; }}
    
    void lista::popfront(){
    
    if(inizio == NULL)
    return;
    
    nodo * scorri = inizio;
    inizio = inizio->next;
    delete scorri;  
    
    if(inizio == NULL)
    fine = NULL;  }
    
    void lista::delete_list(){
    nodo * scorri = inizio;
    nodo * pre = NULL;
    
    while(scorri == fine){
    pre = scorri;
    if(scorri == fine)
    scorri = scorri->next; 
    
    if(pre != NULL)
    delete pre; }
    
    inizio = fine = NULL;
    cout << "fine"; }
    
    string nodo::get_nome()
    { return nome;  }
    
    int nodo::get_hp()
    { return hp; }
    
    int nodo::get_attacco()
    { return attacco; }
    
    nodo* nodo::nodo_next()
    { return next; }
    
    void nodo::set_nome(string x)
    { nome = x; }
    
    void nodo::set_hp(int x)
    { hp = x; }
    
    void nodo::set_attacco(int x)
    { attacco = x; }
    
    
    
    
    int main(){
    
    lista uno;
    
    cout << "prima stampa" << endl;
    uno.pushback("primo",500,210);
    uno.pushback("secondo",340,110);
    uno.pushback("terzo",220,250);
    cout << uno;
    
    
    cout << "elimina il primo" << endl;
    uno.popfront();
    cout << uno;
    
    
    cout << "aggiungi quarto" << endl;
    uno.pushback("quarto",444,888);
    cout << uno;
    
    
    cout << "cancella la lista" << endl;
    uno.delete_list();
    cout << uno;
    
    
    cout << "aggiungi 5 & 6" << endl;
    uno.pushback("quinto",544,333);
    uno.pushback("sesto",344,777);
    cout << uno;
    
    
    
       
    }
    
    
    
  • Re: Problema con overloading <<

    ilclone ha scritto:


    Grazie della risposta si sto cercando di implementare una linkedlist e ho risolto il problema con operatore << ma adesso ho dei problemi con il distruttore in cui metto la funzione delete (che ho rivisto) che rilascia array creato dinamicamente però ho notato che il programma lo richiama molte volte durante l'esecuzione, dovrebbe richiamarlo solo quando esce dallo scope o quando il programma termina
    
    #include <iostream>
    
    using namespace std;
    
    class nodo {
    
    private:
    string nome;
    int hp;
    int attacco; 
    nodo * next; 
    
    public:
    nodo(string a,int b,int c) : nome(a),hp(b),attacco(c),next(NULL){ }
    nodo() : nome("undefined"),hp(99),attacco(0),next(NULL){ }
    
    string get_nome();
    int get_hp();
    int get_attacco();
    nodo* nodo_next();
    void set_nome(string x);
    void set_hp(int x);
    void set_attacco(int x);
    
    
    friend ostream& operator<<(ostream& os,const nodo &x){
    os << x.nome << endl;
    os << x.hp << endl;
    os << x.attacco << endl;  
    return os; }
    
    friend class lista;
    };
    
    class lista { 
    
    private:
    nodo* inizio;
    nodo* fine; 
    
    public:
    lista(){ inizio = fine = NULL; }
    ~lista(){ delete_list(); }
    
     
    
    nodo* front() const;
    nodo* back() const; 
    void pushback(string,int,int);
    void popfront();
    void delete_list();
    void stampa();
    
    friend ostream& operator<<(ostream& os, const lista x){
    nodo * scorri = x.front();
    
    if(scorri == NULL)
    os << "la lista è vuota" << endl; 
    
    while(scorri != NULL){
    os << *scorri;
    scorri = scorri->nodo_next(); }
    
    return os; }
    
    
    
    };
    
    nodo* lista::front() const
    { return inizio; }
    
    nodo* lista::back() const
    { return fine; }
    
    void lista::pushback(string a,int b,int c){
    
    nodo* nuovo = new nodo(a,b,c);
    
    if(fine == NULL)
    inizio = fine = nuovo; 
    
    else {
    fine->next = nuovo;
    fine = nuovo; }}
    
    void lista::stampa(){
    nodo * scorri = inizio;
    
    while(scorri != NULL){
    cout << *scorri;
    scorri = scorri-> next; }}
    
    void lista::popfront(){
    
    if(inizio == NULL)
    return;
    
    nodo * scorri = inizio;
    inizio = inizio->next;
    delete scorri;  
    
    if(inizio == NULL)
    fine = NULL;  }
    
    void lista::delete_list(){
    nodo * scorri = inizio;
    nodo * pre = NULL;
    
    while(scorri == fine){
    pre = scorri;
    if(scorri == fine)
    scorri = scorri->next; 
    
    if(pre != NULL)
    delete pre; }
    
    inizio = fine = NULL;
    cout << "fine"; }
    
    string nodo::get_nome()
    { return nome;  }
    
    int nodo::get_hp()
    { return hp; }
    
    int nodo::get_attacco()
    { return attacco; }
    
    nodo* nodo::nodo_next()
    { return next; }
    
    void nodo::set_nome(string x)
    { nome = x; }
    
    void nodo::set_hp(int x)
    { hp = x; }
    
    void nodo::set_attacco(int x)
    { attacco = x; }
    
    
    
    
    int main(){
    
    lista uno;
    
    cout << "prima stampa" << endl;
    uno.pushback("primo",500,210);
    uno.pushback("secondo",340,110);
    uno.pushback("terzo",220,250);
    cout << uno;
    
    
    cout << "elimina il primo" << endl;
    uno.popfront();
    cout << uno;
    
    
    cout << "aggiungi quarto" << endl;
    uno.pushback("quarto",444,888);
    cout << uno;
    
    
    cout << "cancella la lista" << endl;
    uno.delete_list();
    cout << uno;
    
    
    cout << "aggiungi 5 & 6" << endl;
    uno.pushback("quinto",544,333);
    uno.pushback("sesto",344,777);
    cout << uno;
    
    
    
       
    }
    
    
    
    Il problema è che chiami il d-tor della lista da operator<<, controlla bene l'operatorore
Devi accedere o registrarti per scrivere nel forum
3 risposte