P.o.o. operatori di ridefinizione

di il
3 risposte

P.o.o. operatori di ridefinizione


class HomeCinema
{
private:
    list<Componente> componenti;
    public:
    HomeCinema(); // costruttore default
    HomeCinema(const HomeCinema & hc);// costruttore
    friend ostream& operator<<(const ostream& hc, const HomeCinema& a); //operatore <<
    bool operator!=(const HomeCinema& a); // operator !=
    double costo()
    {
        double sum=0;
        for(list<Componente>::iterator i= componente.begin(); i != componenti.end();i++)
        {
            sum+=(*i).costo();
        } // chiusura for
        return sum;
    } // chiusura costo
    bool aggiungiComponente(Componente c)
    {
        for(list<Componente>::iterator i= componente.begin(); i != componenti.end();i++)
        {
            if(!(*i).compatibileCon(c))
            { 
                return false;
            } // chiusura if
        } // chiusura for
        componenti.push_back(c);
        return true;
    } // chiusura aggiungiComponenti
}; // chiusura classe
a) completare l implementazione dei metodi specificati
b) progettare le/la classe componente in modo da consentire la configurazione di un impianto con i piu comuni componenti(TV, amplificatore,diffusori frontali,laterali subwoofer ecc.)

ho implementato i due operatori di ridefinizione:

friend ostream& operator<<(ostream& out,HomeCinema& h)
{
    for(list<Componente>::iterator it=h.componenti.begin();it!=h.componenti.end();it++)
    {
        out<<(*it).getTV()<< " "<<(*it).getAmplificatore()<< " "<<(*it).getSubWoofer<<endl;
    }
    return out;
}

bool operator!=(const HomeCinema& a)
{

if(componenti.size()!=a.componenti.size())
return false;

list<Componente>::iterator jt=componenti.begin();

for(list<Componente>::iterator it=a.componenti.begin();it!=a.componenti.end();it++)
{
if((*b).getNomeComponente()==(*it).getNomeComponente() || (*b).getPrezzo() == (*it).getPrezzo)
{
return false;
} //chiusura if
b++;
}//chiusura for
return true;
}//chiusura funzione 

3 Risposte

  • Re: P.o.o. operatori di ridefinizione

    Prima di tutto devi fare l'overload dell'operatore == nella classe componenti. Secondo l'operatore != è creato in corrispondeza dell'operatore == quindi devi creare anche quello
    
    bool MyClass::operator==(const MyClass &other) const {
        ...  
      }
    
      bool MyClass::operator!=(const MyClass &other) const {
        return !(*this == other);
      }
    
    Puoi usare std::equal per verificare se due range hanno valori uguali quindi non c'è bisogno di tutto quel loop.
  • Re: P.o.o. operatori di ridefinizione

    Per il << va bene???
  • Re: P.o.o. operatori di ridefinizione

    Non proprio. Definendo l'operatore << nella classe Componente tutto si riduce a
    
    ostream& operator<<(ostream& out,const HomeCinema& h)
    {
        for(list<Componente>::iterator it=std::begin(h.componenti); it!= std::end(h.componenti);++it)
        {
            out << *it;
        }
        return out;
    }
    
    oppure
    
    void Stampa (const Componente & i) {
      cout << i;
    }
    
    ostream& operator<<(ostream& out,const HomeCinema& h)
    {
       std::for_each(std::begin(h.componenti),std::end(h.componenti), Stampa);
       return out;
    }
    
    oppure se il tuo compilatore supporta i lambda
    
    ostream& operator<<(ostream& out,const HomeCinema& h)
    {
       std::for_each(std::begin(h.componenti),std::end(h.componenti), 
           [](const Componente & i)
           {
              cout << i;
           });
        return out;
    }
    
Devi accedere o registrarti per scrivere nel forum
3 risposte