PDA

Visualizza la versione completa : [C++]Overload operatore <


§elva
08-01-2014, 16:44
Ciao a tutti! :ciauz:
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:

public:
bool operator <(const ATask& other);
AJob *job;

ATask.cpp:

bool ATask::operator <(const ATask& other){
return job->getr() < other.job->getr();
}

Job.h:

private:
int r;
public:
int getr() const;

Job.cpp:

int AJob::getr() const
{
return r;
}

nel programma principale dichiaro

std::vector<ATask*> ATasks;
in cui inserisco diversi puntatori di ATask per poi utilizzare

std::sort(ATasks.begin(), ATasks.end());

Ho letto mille guide, ma non capisco cosa c'è di sbagliato..
Grazie :ciauz:
Nicola

shodan
08-01-2014, 17:41
std::sort() richiede che l'operatore < sia globale.
Risolvi così:


bool operator <(const ATask& lhs, const ATask& rhs ){
// invoca l'operatore definito nella classe.
return lhs < rhs ;
}

§elva
08-01-2014, 17:58
L'ho modificato in questo modo

bool ATask::operator <(const ATask& lhs, const ATask& rhs ){
return lhs.job->getr() < rhs.job->getr() ;
}

aggiungendo nel .h:

bool operator <(const ATask& lhs, const ATask& rhs );

In questo modo mi da il seguente errore in compilazione:
"‘bool ATask::operator<(const ATask&, const ATask&)’ must take exactly one argument"

Idee? :) Grazie intanto

shodan
08-01-2014, 18:36
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ì:



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.

§elva
08-01-2014, 19:00
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..

MItaly
08-01-2014, 19:00
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.

§elva
08-01-2014, 19:14
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

Loading