Programma Libreria

di Anonimizzato17761 il
8 risposte
Ciao a tutti.
Ho un problema abbastanza importante. Ho dovuto costruire un programma con due classi, una Libreria e una Libro, per un'ipotetica libreria. Va tutto bene tranne una cosa: la funzione vendi quando la applico mi stampa il numero di copie ridotto di un(come giusto che sia). Se però poi richiamo la funzione elenco, questa mi si ripresenta invariata.
Credo non mi modifichi la variabile "numero" permanentemente ma solo temporaneamente. Il problema è che non so come fare perchè lo faccia.
Vi mando il codice delle funzioni che c'entrano di più.
#include "libro.h"

Libro::Libro()
{

}

QString Libro::getter()
{
    QString s;
    s.append(this->titolo);
    s.append("\t");
    s.append(this->autore);
    s.append("\t");
    s.append(QString::number(this->numero));
    return s;
}

void Libro::setter(QString tit, QString aut, int nc)
{
    this->titolo=tit;
    this->autore=aut;
    this->numero=nc;
}

int Libro::getnumero()
{
    return this->numero;
}

void Libro::menocopie(int count)
{
    this->numero=count;
}

QString Libro::gettitolo()
{
    return this->titolo;
}

Libro::~Libro()
{

}
void Libreria::vendi()
{
    ui->textEdit->clear();
    ui->textEdit->append("Libri venduti\n\nTitolo\tAutore\tQuantita'\n");
    QVector<Libro>::Iterator i;
    Libro l;
    bool ok;
    ok=NULL;
    QString titolo;
    titolo=QInputDialog::getText(this,tr("Ricerca Titolo"),tr("Inserisci il titolo del libro"),QLineEdit::Normal,"",&ok);
    ok=NULL;
    int count=0;
    for (i=v.begin();i!=v.end();i++)
    {
        l=*i;
        if (titolo==l.gettitolo())
        {
            int copie=l.getnumero();
            if (copie>0)
            {
                copie--;
                l.menocopie(copie);
                count++;
                ui->textEdit->append(l.getter());
            }
        }
    }
    if (count==0)
    {
        ui->textEdit->clear();
        ui->textEdit->append("Non ci sono libri con questo titolo");
    }

}
#ifndef LIBRO_H
#define LIBRO_H
#include<QString>

class Libro
{
private:
    QString titolo;
    QString autore;
    int numero;

public:
    Libro();
    QString getter();
    void setter(QString tit, QString aut, int nc);
    void menocopie(int count);
    QString gettitolo();
    int getnumero();
    ~Libro();
};

#endif // LIBRO_H

8 Risposte

  • Se fai la copia dell'oggetto in l durante l'iterazione lavori sulla copia che poi viene distrutta, quindi ...
  • l=*i;
    Il problema sta qua.
    Tu stai faccendo una copia dell'oggetto e non stai lavorando su quello reale.
    soluzione
    
    Togli l è aggisci con i->
    
    for (i=v.begin();i!=v.end();i++)
        {
           if (titolo==i->gettitolo())
            {
                int copie=i->getnumero();
                if (copie>0)
                {
                    copie--;
                    i->menocopie(copie);
                    count++;
                    ui->textEdit->append(i->getter());
                }
            }
        }
    
  • Grazie mille della risposta skynet.
    Volevo solo chiedere una cosa. Io pensavo che il passaggio l=*i associasse l'elemento l al valore puntato da i. i pensavo quindi fosse un puntatore.
    Non capisco dunque perchè abbia le funzioni di un vettore libro l.
  • I è un puntatore ma *i è l'oggetto e come ti avevo detto prima tu fai la copia dell'oggetto
  • oregon ha scritto:


    i è un puntatore ma *i è l'oggetto e come ti avevo detto prima tu fai la copia dell'oggetto
    Ok ma mettere i-> e le varie procedure non mi modifica il puntatore? O la freccia significa modificare quello che sta puntando?

    Inviato dal mio GT-I9300 utilizzando Tapatalk
  • Non sai cosa fa l'operatore -> freccia?
  • oregon ha scritto:


    Non sai cosa fa l'operatore -> freccia?
    Diciamo che il mio prof non è stato molto chiaro su cosa fa. Ci ha detto solo come si usa. Purtroppo informatica da me è fatta un po cosi. Non ho neanche riferimenti su cui studiare
  • Beh, certamente non modifichi il puntatore ma accedi ai membri dell'oggetto tramite il suo puntatore.
Devi accedere o registrarti per scrivere nel forum
8 risposte