Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    37

    [C++] Problema coi puntatori

    Ciao a tutti! Ho un problema abbastanza serio, ovvero mercoledì ho l'esame di programmazione in C++ e ho appena scoperto di avere problemi coi puntatori per favore potreste darmi una mano? Vi copio un programma che ho scritto tratto da un esame vecchio del mio prof:
    Scrivere un programma per la gestione delle carte SIM ricaricabili emesse da un gestore di telefonia ai suoi clienti che possano essere usate solo per l'invio di SMS, ridefinendo l'operatore <<. Suggerisce il professore di creare una classe per il gestore di telefonia avente un archivio di sms e sim e una classe SIM ed sms. Ometto la classe del gestore perchè per ora non mi interessa, vi copio le classi sim ed sms ed il main:

    codice:
    //In file "Sim.h"
    
    #ifndef SIM_H
    #define SIM_H
    
    #include <iostream>
    using std::cout;
    using std::cin;
    using std::endl;
    using std::ostream;
    
    #include <cstring>
    using std::string;
    
    class Sim{
          friend ostream& operator<<(ostream&, const Sim&);
          
          private:
                  string numero, pin, fiscale;
                  double residuo;
          public:
                 Sim(string="", string="", string="", double=0);
                 const double getresiduo();
                 void ricarica(const double);
                 void setnumero(const string);
                 void setpin(const string);
                 void setfiscale(const string);
                 void setresiduo(const double);
                 const string getnumero();
                 const string getpin();
                 const string getfiscale();
    };
    
    #endif
    codice:
    //In file "Sim.cpp"
    
    #include "Sim.h"
    
    Sim::Sim(string a, string b, string c, double d)
    {
        numero = a;
        pin = b;
        fiscale = c;
        residuo = d;
    }
    
    const double Sim::getresiduo()
    {
        return residuo;
    }
    
    void Sim::ricarica(const double a)
    {
         residuo+=a;
    }
    
    void Sim::setnumero(const string a)
    {
         numero = a;
    }
    
    void Sim::setpin(const string a)
    {
         pin = a;
    }
    
    void Sim::setfiscale(const string a)
    {
         fiscale = a;
    }
    
    void Sim::setresiduo(const double a)
    {
         residuo = a;
    }
    
    const string Sim::getnumero()
    {
          return numero;
    }
    const string Sim::getpin()
    {
          return pin;
    }
    
    const string Sim::getfiscale()
    {
          return fiscale;
    }
    
    ostream& operator<<(ostream& out, const Sim& a)
    {
         out << endl << "Dati della SIM: "
             << endl << "Numero:   " << a.numero
             << endl << "PIN:      " << a.pin
             << endl << "CF:       " << a.fiscale
             << endl << "Credito:  " << a.residuo
             << endl << endl;
         return out;
    }
    codice:
    //In file "Sms.h"
    
    
    #ifndef SMS_H
    #define SMS_H
    
    #include "Sim.h"
    
    class Sms{
          friend ostream& operator <<(ostream&, const Sms&);
          
          private:
                  double costo;
                  Sim *mittente;
                  string destinatario, data, testo;
          public:
                 Sms(Sim a, double=0.15, string="", string="", string="");
                 Sms(double=0.15, string="", string="", string="");
                 void settesto(const string);
                 void setcosto(const double);
                 void setdestinatario(const string);
                 void setdata(const string);
                 void setmittente(string, string, string, double );
                 const string getdestinatario();
                 const string getdata();
                 const string gettesto();
                 const double getcosto();   
    };
    
    #endif
    codice:
    //In file "Sms.cpp"
    
    #include "Sms.h"
    
    Sms::Sms(Sim e, double a, string b, string c, string d)
    {
        string h, f, g;
        double i;            
                    
        setcosto(a);
        setdestinatario(b);
        setdata(c);
        settesto(d);
        
        h = e.getnumero();
        f = e.getpin();
        g = e.getfiscale();
        i = e.getresiduo();
        
        setmittente(h,f,g,i);
    }
    
    Sms::Sms(double a, string b, string c, string d)
    { 
        setcosto(a);
        setdestinatario(b);
        setdata(c);
        settesto(d);
        mittente = NULL;
    }
    
    void Sms::settesto(const string a)
    {
         testo = a;
    }
    
    void Sms::setcosto(const double a)
    {
         costo = a;
    }
    
    void Sms::setdestinatario(const string a)
    {
         destinatario = a;
    }
    
    void Sms::setdata(const string a)
    {
         data = a;
    }
    
    void Sms::setmittente(string a, string b, string c, double d)
    {
         mittente = new Sim(a,b,c,d);
    }
    
    const double Sms::getcosto()
    {
          return costo;
    }
    
    ostream& operator <<(ostream& out, const Sms& a)
    {
         out << endl << "Dati dell'sms: "
             << endl << "Destinatario:    " << a.destinatario
             << endl << "Data:            " << a.data
             << endl << "Costo:           " << a.costo
             << endl << "Testo:           " << a.testo;
         
         cout << endl << a.mittente << endl << endl;
         
         return out;
    }
    codice:
    //In file "main.cpp"
    
    
    #include "Sim.h"
    #include "Sms.h"
    #include "GestoreSMS.h"
    
    
    int main()
    {
        GestoreSMS a;
        Sim b1("3234686493", "3454", "RETUIN91H03G273T", 2.12);
        Sim b2("337654564", "8474", "POLRTM92H06G273H", 0.89);
        Sms c1(b1,0.15, "092353943", "08/07/2012", "Prova");
        Sms c2(b1,0.15, "821734629", "08/07/2012", "Tanto");
        Sms c3(b2,0.15, "245245245", "08/07/2012", "Non");
        Sms c4(b2,0.15, "342543636", "08/07/2012", "Funziona");
        cout << b1 << b2;
        cout << c1 << c2 << c3 << c4;
        
        system("PAUSE");
        return 0;
    }
    Il problema evidentemente riguarda l'inizializzazione degli oggetti Sms, non riesco a passargli decentemente un oggetto Sim, ho provato in vari modi, passandolo fisicamente, tramite puntatori, creandolo direttamente dal costruttore... Questa è l'ultima versione che ho provato, per disperazione! Qualche buon'anima mi darebbe una mano?

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    37
    Proprio nessuno sa aiutarmi? Dopo domani avrei l'esame

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    #include <string>
    using std::string;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    37
    Potresti essere un po' più chiaro?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    L'header corretto per il tipo di dato string è <string>, non <cstring>
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    37
    Grazie per la correzione, non lo sapevo. Comunque il problema non è questo, non è l'header errato ad impedire la creazione degli oggetti :/

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Boh, a me compila e funziona che è un piacere.
    C'è quel:
    codice:
    Sim* mittente
    che sarebbe da gestire meglio, ma per come è scritto il codice funziona.
    (Che poi io, per me, ti boccierei solo per la malagestione del puntatore in se è un altro discorso ).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    37
    Per compilare compila, il problema è che quando uso l'operatore << ridefinito per la classe sms dovrebbe stampare i dati sull'sms e poi stampare i dati della sim tramite l'operatore <<. Invece di stampare però i dati sulla sim contenuta in sms stampa l'indirizzo dell'oggetto sim, questo è il problema...

  9. #9
    Tu hai definito l'operatore << che lavora con l'indirizzo dell'oggetto Sim
    codice:
    ostream& operator<<(ostream& out, const Sim& a)
    {
         out << endl << "Dati della SIM: "
             << endl << "Numero:   " << a.numero
             << endl << "PIN:      " << a.pin
             << endl << "CF:       " << a.fiscale
             << endl << "Credito:  " << a.residuo
             << endl << endl;
         return out;
    }
    Quando però in quest'altra funzione tu chiami <<a.mittente, mittente è un puntatore, quindi non contiene un oggetto Sim, bensì l'indirizzo di memoria di un oggetto Sim, quindi lui ti stampa esattamente quello che ci trova dentro.
    codice:
    ostream& operator <<(ostream& out, const Sms& a)
    {
         out << endl << "Dati dell'sms: "
             << endl << "Destinatario:    " << a.destinatario
             << endl << "Data:            " << a.data
             << endl << "Costo:           " << a.costo
             << endl << "Testo:           " << a.testo;
         
         cout << endl << a.mittente << endl << endl; 
         //mittente non contiene un oggetto Sim ma l'indirizzo di un oggetto Sim
         return out;
    }
    Ti basta fare l'overloading della funzione in modo che se gli passi un puntatore sappia cosa andare a prendere.
    Quindi oltre a quella che hai già scritto scrivi anche:
    codice:
    ostream& operator<<(ostream& out, const Sim* a)
    {
         out << endl << "Dati della SIM: "
             << endl << "Numero:   " << a->numero
             << endl << "PIN:      " << a->pin
             << endl << "CF:       " << a->fiscale
             << endl << "Credito:  " << a->residuo
             << endl << endl;
         return out;
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    37
    Grazie mille, effettivamente era una cavolata... Comunque penso che si possa chiudere l'argomento ora, grazie a tutti per la disponibilità

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