Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di §elva
    Registrato dal
    Nov 2006
    Messaggi
    607

    [C++]Overload operatore <

    Ciao a tutti!
    Devo sovrascrivere l'operatore di confronto < in una classe che ho scritto in modo da poter utilizzare la funzione sort della libreria standard per ordinare un vettore di oggetti della classe..
    Bene, al momento non funziona..

    ATask è la classe che deve sovrascrivere l'operatore.. Questa contiene un campo Job*: Job è un'altra classe che ho implementato la quale contiene un "int r " sul quale deve avvenire l'ordinamento..

    ATask.h:
    codice:
    public:
        bool operator <(const ATask& other);
        AJob *job;
    ATask.cpp:
    codice:
    bool ATask::operator <(const ATask& other){
        return job->getr() < other.job->getr();
    }
    Job.h:
    codice:
    private:
     int r;
    public:
    int getr() const;
    Job.cpp:
    codice:
    int AJob::getr() const
    {
        return r;
    }
    nel programma principale dichiaro
    codice:
    std::vector<ATask*> ATasks;
    in cui inserisco diversi puntatori di ATask per poi utilizzare
    codice:
    std::sort(ATasks.begin(), ATasks.end());
    Ho letto mille guide, ma non capisco cosa c'è di sbagliato..
    Grazie
    Nicola
    da sempre l'ignoranza fa paura, ma il silenzio è uguale a morte

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    std::sort() richiede che l'operatore < sia globale.
    Risolvi così:
    codice:
    bool operator <(const ATask& lhs, const ATask& rhs ){
        // invoca l'operatore definito nella classe.
        return lhs < rhs ;
    }
    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.

  3. #3
    Utente di HTML.it L'avatar di §elva
    Registrato dal
    Nov 2006
    Messaggi
    607
    L'ho modificato in questo modo
    codice:
    bool ATask::operator <(const ATask& lhs, const ATask& rhs ){
        return lhs.job->getr() < rhs.job->getr() ;
    }
    aggiungendo nel .h:
    codice:
    bool operator <(const ATask& lhs, const ATask& rhs );
    In questo modo mi da il seguente errore in compilazione:
    "‘bool ATask:perator<(const ATask&, const ATask&)’ must take exactly one argument"

    Idee? Grazie intanto
    da sempre l'ignoranza fa paura, ma il silenzio è uguale a morte

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Scusa, ma se ho detto che:
    std::sort() richiede che l'operatore < sia globale.
    perché hai aggiunto un parametro nell'operatore < della funzione membro, che accetta un solo parametro e non è globale?
    Piuttosto dal momento che stai usando puntatori dovrai modificare la funzione così:

    codice:
    bool operator <(const ATask& lhs, const ATask& rhs ){
        // invoca l'operatore definito nella classe.
        return (*lhs) < (*rhs) ;
    }
    o ti ritrovi a confrontare gli idirizzi dei puntatori invece degli oggetti.
    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.

  5. #5
    Utente di HTML.it L'avatar di §elva
    Registrato dal
    Nov 2006
    Messaggi
    607
    Perdona la mia ignoranza, ma è un progetto scolastico proprio per migliorare il mio livello di programmazione..
    Cosa intendi per "globale" all'interno della classe? In ogni caso dovrò modificare l'espressione dopo il return se voglio comparare il campo int contenuto in un oggetto che a sua volta e contenuto nella mia classe..
    da sempre l'ignoranza fa paura, ma il silenzio è uguale a morte

  6. #6
    Non mi pare sia possibile creare overload di operatori per puntatori (e in generale per tipi primitivi); piuttosto, creati un functore di confronto e passa quello come parametro della sorte. In effetti, per confrontare container di puntatori e simili si può creare un generico functore template che di fatto faccia return *lhs < *rhs.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di §elva
    Registrato dal
    Nov 2006
    Messaggi
    607
    Nel caso in cui usassi degli oggetti e non puntatori, come posso sovrascrivere l'operatore? Di fatto non è necessario utilizzare puntatori, ma non sono ancora riuscito a sovrascrivere l'operatore..
    Grazie, Nicola
    da sempre l'ignoranza fa paura, ma il silenzio è uguale a morte

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.