Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Uso degli operatori ridefiniti

    Ciao a tutti. Oggi ho fatto una simulazione di un esame C++ in cui dovevo creare un programma per la gestione delle iscrizioni agli esami di un corso di laurea ecc...
    Alla fine del testo c'era scritto di usare la ridefinizione degli operatori << e >> quando lo si riteneva utile.
    Le classi da creare erano 3 esclusa la main, e cioè: Esame, Studente e CorsoLaurea.
    Io gli operatori li ho ridefiniti per stampare e modificare i campi degli oggetti Studente e Esame, poichè CorsoLaurea richiama i metodi della classe Esame per iscrizioni, cancellazioni, stampare elenchi ecc... quindi non aveva bisogno di ridefinirli.
    A questo punto mi sono ritrovato nella classe CorsoLaurea a dover definire i metodi aggiungiStudente e aggiungiEsame rispettivamente agli array dinamici di oggetti Studente e Esame. In entrambi i casi per evitare di riscrivere tutti i cout<<"Inserisci Nome, Cognome ecc.. e i cin>> per ridefinire i campi per creare i nuovi oggetti, ho deciso do usare la ridefinizione degli operatori << e >> scrivendo questo codice:

    codice:
    void CorsoLaurea::aggiungiEsame(Esame* e){
         cin>>e;            //mi riferisco a questo
         for(int i=0;i<50;++i)
             if(esami[i]==0){
               esami[i]=e;
                break;
                }
    dove l'operatore >> è stato ridefinito nella classe Esame come:

    codice:
    istream& operator>>(istream& en, Esame& e){
             cout<<"Inserisci il nome della materia:"; en>>e.materia; cout<<endl;
             cout<<"Inserisci il nome del docente:"; en>>e.docente; cout<<endl;
             cout<<"Inserisci la data dell'esame:"; en>>e.data; cout<<endl;
             return en;
             }
    Ma mi da errore. Come potrei usare la ridefinizione in un caso del genere per evitare di riscrivere tutti i cout e i cin?

  2. #2
    dove l'operatore >> è stato ridefinito nella classe Esame come:
    In questo caso non lo puoi ridefinire come metodo della classe Esame, dato che l'operando di sinistra non è un'istanza della classe Esame ma un oggetto istream. In sostanza, va bene quella definizione ma deve essere una funzione "libera".

    Tra parentesi, far fare dell'output all'operatore >> non è una buona idea, dato che esso potrebbe anche essere usato per leggere da un file: in tal caso che senso avrebbe stampare quella roba sullo schermo? Se proprio vuoi (è leggermente improprio) potresti usare il metodo en.tie() per ottenere un puntatore all'ostream associato con l'istream che hai ottenuto (sarà &cout per cin, NULL per la maggior parte degli altri stream) ed eventualmente usare quello per l'output.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Quindi non c'è modo di utilizzarlo per evitare di riscrivere le cose, giusto?
    Potresti farmi un piccolo e banale esempio di utilizzo di >> nel caso dell'es. precedente?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,301

    Moderazione

    Come espressamente indicato nel Regolamento interno, il linguaggio va obbligatoriamente indicato nel titolo ed il codice va postato usando gli appositi tag CODE.

    Sistemo io.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ok, la prossima volta starò mi atterrò alle regole.

  6. #6
    Originariamente inviato da AlexlovesUSA
    Quindi non c'è modo di utilizzarlo per evitare di riscrivere le cose, giusto?
    Diciamo che non è il modo con cui ci si aspetta di usarlo. Tuttavia l'uso di tie() (che in realtà non è proprio proprio pensato per questo, ma di fatto viene usato solo per questo scopo) può salvarti.
    Potresti farmi un piccolo e banale esempio di utilizzo di >> nel caso dell'es. precedente?
    Questa roba va tenuta semplicemente come funzione libera, non come membro della classe:
    codice:
    std::istream& operator>>(std::istream& en, Esame& e)
    {
        std::ostream * out=en.tie();
        if(out!=NULL)
            (*out)<<"Inserisci il nome della materia:";
        en>>e.materia;
        if(out!=NULL)
            (*out)<<"\nInserisci il nome del docente:";
        en>>e.docente;
        if(out!=NULL)
            (*out)<<"\nInserisci la data dell'esame:";
        en>>e.data;
        if(out!=NULL)
            (*out)<<std::endl;
        return en;
    }
    In questa maniera puoi usare questo estrattore sia su cin (nel qual caso saranno stampati i vari prompt) sia su file (e in quel caso non saranno stampati).
    Nota che in generale, a parte che nel caso finale, gli endl non sono necessari (basta un \n), dato che, proprio per il fatto che out è il puntatore restituito da tie, è garantito che il suo flushing avvenga in automatico prima di ogni operazione di input su en.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Ok, grazie mille. Ciao

  8. #8
    Amaro C++, il gusto pieno dell'undefined behavior.

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