Errore Ridefinizione degli operatori

di il
5 risposte

Errore Ridefinizione degli operatori

Ciao ragazzi, sono alle prese con POO in C++, ho un problema per quanto riguarda le ridefinizione degli operatori in c++. Allego il file.h, il codice degli operatori e il messaggio di errore che ricevo.

Ovviamente la classe fa riferimento anche ad un'altra classe Studente, che non allego poichè superflua rispetto al problema che ho. Il messaggio di errore che ricevo è il seguente:

no match for operator >> ( operand types are ' std::istream and 'Studente')

Ho provato a cercare su altri forum, ma non sono ancora riuscito a capire il perchè di questo errore.


#ifndef UNIVERSITA_H
#define UNIVERSITA_H
#include"Studente.h"

class Universita
{
    friend std::istream& operator>>(istream&, Universita &);
    friend std::ostream& operator<<(ostream&,const Universita &);

    private:
        string nome;
        Studente* studenti;
        unsigned* matricole;
        unsigned size;
        unsigned capacity;

    public:
        Universita();
        Universita(string,unsigned,unsigned,Studente*,unsigned*);
        Universita(const Universita&);
        ~Universita();
        Universita &operator=(const Universita&);
        const string& getCodiceFiscaleStudente(unsigned);
        void aggiungiStudente(const Studente&,unsigned);
        bool isIscritto(const Studente &);
        const Studente& operator[] (unsigned) const;
        unsigned getSize() const;
        string getNomeUniversita() const;
  };

#endif // UNIVERSITA_H



std::istream& operator >>(std::istream& i,Universita& u)
{
    i>>u.nome;
    i>>u.capacity;
    i>>u.size;
    u.studenti = new Studente[u.capacity];
    u.matricole = new unsigned[u.capacity];

    for(int j=0;j<u.size;j++)
    {
        i>>u.studenti[j];
        i>>u.matricole[j];
    }
    return i;
}

std::ostream& operator <<(ostream& o,const Universita& u)
{
    o<<u.nome;
    o<<u.capacity;
    o<<u.size;

    for(int i=0;i<u.size;i++)
    {
        o<<u.studenti[i];
        o<<u.matricole[i];
    }

    return o;
}


5 Risposte

  • Re: Errore Ridefinizione degli operatori

    L'operatore >> p ridefinito nella classe Studente (che non hai mostrato)?
  • Re: Errore Ridefinizione degli operatori

    No nella classe studente ho solamente ridefinito l'operatore << e l'operatore ==, come richiesto dalla traccia dell'esercizio
  • Re: Errore Ridefinizione degli operatori

    Non so nulla della tua traccia ma se scrivi

    i>>u.studenti[j

    ne hai bisogno
  • Re: Errore Ridefinizione degli operatori

    Va bene, però ridefinendo l'operatore anche nella classe studente, non mi da più quell'errore. Me ne da altri (come ide uso Codeblocks) :
    ||=== Build file: "no target" in "no project" (compiler: unknown) ===|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::Studente()'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::Studente()'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::getCodiceFiscale[abi:cxx11]() const'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::Studente()'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::operator==(Studente const&) const'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::Studente()'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `operator>>(std::istream&, Studente&)'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `operator<<(std::ostream&, Studente const&)'|
    D:\CodeBlocks\Universita.o:Universita.cpp|| undefined reference to `Studente::Studente()'|
    c:\mingw\bin\..\lib\gcc\mingw32\6.3.0\..\..\..\libmingw32.a(main.o):(.text.startup+0xa0)||undefined reference to `WinMain@16'|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 11 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===|
  • Re: Errore Ridefinizione degli operatori

    oregon ha scritto:


    Non so nulla della tua traccia ma se scrivi

    i>>u.studenti[j

    ne hai bisogno
    Per completezza allego tutti i file che ho scritto :
    
    
    //FIle Studente.h 
    
    
    #ifndef STUDENTE_H
    #define STUDENTE_H
    #include<string>
    #include<iostream>
    using namespace std;
    
    class Studente
    {
        friend std::ostream& operator<<(ostream&,const Studente&);
        friend std::istream& operator >>(istream&,Studente&);
    
        private:
            string nome;
            string cognome;
            string codiceFiscale;
    
        public:
            Studente();
            Studente(const string&,const string&,const string&);
            const string& getNome() const;
            const string& getCognome() const;
            const string& getCodiceFiscale() const;
            bool operator == (const Studente &) const;
    };
    
    #endif // STUDENTE_H
    
    //FIle Studente.cpp
    
    #include "Studente.h"
    
    Studente::Studente() { }
    
    Studente::Studente(const string& n,const string& c,const  string& cf)
    {
        nome = n;
        cognome = c;
        codiceFiscale = cf;
    }
    
    const string& Studente::getCodiceFiscale() const
    {
        return codiceFiscale;
    }
    
    const string& Studente::getCognome() const
    {
        return cognome;
    }
    
    const string& Studente::getNome() const
    {
        return nome;
    }
    
    bool Studente::operator==(const Studente& s) const
    {
        if( (this->nome==s.nome) && (this->cognome==s.cognome) && (this->codiceFiscale==s.codiceFiscale) )
            return true;
        else
            return false;
    }
    
    ostream &operator<<(ostream &o,const Studente& s)
    {
        o<<"Nome Studente: "<<s.nome<<endl;
        o<<"Cognome Studente: "<<s.cognome<<endl;
        o<<"Codice Fiscale Studente: "<<s.codiceFiscale<<endl;
    
        return o;
    }
    
    istream &operator>>(istream &i,Studente& s)
    {
        i>>s.nome;
        i>>s.cognome;
        i>>s.codiceFiscale;
    
        return i;
    }
    
    //File Universita.h 
    
    #ifndef UNIVERSITA_H
    #define UNIVERSITA_H
    #include"Studente.h"
    
    
    class Universita
    {
        friend std::istream& operator>>(istream&, Universita &);
        friend std::ostream& operator<<(ostream&,const Universita &);
    
        private:
            string nome;
            Studente* studenti;
            unsigned* matricole;
            unsigned size;
            unsigned capacity;
    
        public:
            Universita();
            Universita(string,unsigned,unsigned,Studente*,unsigned*);
            Universita(const Universita&);
            ~Universita();
            Universita &operator=(const Universita&);
            const string& getCodiceFiscaleStudente(unsigned);
            void aggiungiStudente(const Studente&,unsigned);
            bool isIscritto(const Studente &);
            const Studente& operator[] (unsigned) const;
            unsigned getSize() const;
            string getNomeUniversita() const;
    
    
    
    };
    
    #endif // UNIVERSITA_H
    
    
    //FIle Universita.cpp
    
    #include "Universita.h"
    
    
    
    Universita::Universita() { }
    
    Universita::Universita( string n, unsigned s, unsigned c,Studente* S,unsigned* M)
    {
        nome = n;
        size = s;
        capacity = c;
        studenti = new Studente[capacity];
        matricole = new unsigned[capacity];
        for(int i=0;i<size;i++)
        {
            studenti[i] = S[i];
            matricole[i] = M[i];
        }
    
    }
    
    Universita::Universita(const Universita& u)
    {
        nome=u.nome;
        size=u.size;
        capacity=u.capacity;
        studenti=new Studente[capacity];
        matricole=new unsigned[capacity];
    
        for(int i=0;i<size;i++)
        {
            studenti[i] = u.studenti[i];
            matricole[i] = u.matricole[i];
        }
    
    }
    
    Universita::~Universita()
    {
            delete [] studenti;
            delete [] matricole;
    }
    
    const string& Universita::getCodiceFiscaleStudente(unsigned matricola)
    {
        for(int i=0;i<size;i++)
        {
            if(matricole[i] == matricola)
                return studenti[i].getCodiceFiscale();
        }
    }
    
    void Universita::aggiungiStudente(const Studente &s,unsigned m)
    {
        Studente *tmp;
        unsigned *tmp1;
    
        if(capacity<=size)
        {
            studenti[size] = s;
            matricole[size] = m;
            size++;
        }
        else
        {
            tmp = new Studente[capacity*2];
            tmp1 = new unsigned[capacity*2];
    
            for(int i=0;i<size;i++)
            {
                tmp[i] = studenti[i];
                tmp1[i] = matricole[i];
            }
    
            delete [] studenti;
            delete [] matricole;
            studenti = tmp;
            matricole = tmp1;
            studenti[size] = s;
            matricole[size] = m;
            capacity*=2;
            size++;
        }
    }
    
    bool Universita::isIscritto(const Studente& s)
    {
        for(int i=0;i<size;i++)
        {
            if(studenti[i] == s)
                return true;
        }
    
        return false;
    }
    
    unsigned Universita::getSize() const
    {
        return size;
    }
    
    string Universita::getNomeUniversita() const
    {
        return nome;
    }
    
    istream& operator >>(istream& i,Universita& u)
    {
        i>>u.nome;
        i>>u.capacity;
        i>>u.size;
        u.studenti = new Studente[u.capacity];
        u.matricole = new unsigned[u.capacity];
    
        for(int j=0;j<u.size;j++)
        {
            i>>u.studenti[j];
            i>>u.matricole[j];
        }
        return i;
    }
    
    ostream& operator <<(ostream& o,const Universita& u)
    {
        o<<u.nome;
        o<<u.capacity;
        o<<u.size;
    
        for(int i=0;i<u.size;i++)
        {
            o<<u.studenti[i];
            o<<u.matricole[i];
        }
    
        return o;
    }
    
    Universita& Universita::operator=(const Universita& u)
    {
        if(this!=&u)
        {
            delete [] studenti;
            delete [] matricole;
    
            nome=u.nome;
            capacity=u.capacity;
            size=u.size;
    
            studenti = new Studente[size];
            matricole = new unsigned[size];
            for(int i=0;i<size;i++)
            {
                studenti[i] = u.studenti[i];
                matricole[i] = u.matricole[i];
            }
        }
    }
    
    const Studente& Universita::operator[](unsigned s) const
    {
        return studenti[s];
    }
    
    
    
    
Devi accedere o registrarti per scrivere nel forum
5 risposte