2010-02-06 17 views
5

In caso di sovraccarico degli operatori, è necessario sovraccaricare> = < = e! =?overloading dell'operatore C++

Sembra che sarebbe intelligente per C++ chiamare! Operator = for! =,!> Per operatore < = e! < per operatore> =.

In tal caso, o è necessario sovraccaricare ogni funzione?

risposta

2

Sì, è necessario, se si desidera che tutti funzionino nel modo in cui si desidera che funzionino.

C++ non impone alcuna semantica specifica sulla maggior parte degli operatori sovraccaricabili. L'unica cosa che viene corretta è la sintassi generale per l'operatore (incluso essere unario o binario e cose come la precedenza e l'associatività). Ciò significa immediatamente che la funzionalità effettiva implementata nel sovraccarico può essere assolutamente arbitraria. In generale, potrebbe non esserci alcuna connessione significativa tra l'operatore == e l'operatore !=. L'operatore == potrebbe scrivere dati su un file, mentre l'operatore != potrebbe ordinare un array.

Mentre sovraccaricare gli operatori in modo così arbitrario non è certamente una buona pratica di programmazione, il linguaggio C++ non può assumere nulla. Quindi, no, non può e non utilizzerà automaticamente la combinazione ! == al posto della combinazione != o ! > al posto di <=.

+0

Il tuo esempio per '==' e '! =' È piuttosto inventato. Uno più realistico sarebbe una classe che rappresenta un oggetto SQL, in cui devi gestire la semantica speciale di 'NULL'. – dan04

2

No, avete solo bisogno di sovraccaricare operatore == e operatore <, la libreria standard si prenderà cura di tutto il resto :)

(EDIT: vedi using namespace std :: rel_ops;)

+0

Non pensare che sia così ... Se fosse vero perché questa pagina darebbe un esempio di definizione! = In termini di ==? http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html –

+0

Grazie per il chiarimento. –

+1

No, non lo sarà, devi definire esplicitamente ciascun operatore. –

0

Ci sono alcuni shortcuts che è possibile utilizzare, ad esempio CRTP per ottenerli automaticallyinjected (vedere le varie classi di Confronto) nella classe.

+2

Mi chiedo perché questa e la risposta cancellata da stakx siano state annullate. – GManNickG

+0

Mi colpisce, ho smesso di preoccuparmi per il rappresentante molto tempo fa, ma vedo ancora persone che giocano a cercare di influenzare le risposte. –

+2

Si prega di spiegare i motivi quando si downvote. –

7

Boost operators potrebbe essere quello che stai cercando. Questi deriveranno la maggior parte dei tuoi operatori basandoti su alcuni fondamentali.

Questo C++ non fornisce questo automaticamente ha senso, come si potrebbe dare significati completamente diversi a < e, ad esempio (anche se sarebbe spesso una cattiva idea).

+1

C++ fornisce questo come std :: rel_ops, ma è difficile da usare correttamente e possibilmente più corto per digitarli invece da soli (evitando la confusione). –

0

Sì! Sono tutti operatori tecnicamente diversi. I compilatori C++ non sono motori di inferenza intrinseca, sono parser/compilatori. Faranno solo quanto tu dici di fare. http://www.parashift.com/c++-faq-lite/operator-overloading.html, http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

+0

Tranne che sono motori di inferenza! Guarda ADL e scopri le regole di risoluzione del sovraccarico della funzione per un lungo mal di testa. –

+0

Sospetto che ci sarebbero molti ricercatori di intelligenza artificiale che non sarebbero d'accordo con te sulla definizione tecnica di un motore di inferenza nell'informatica. Ma sì, ciò che i moderni compilatori possono "capire" è impressionante. –

+0

La definizione che sto utilizzando: "Un motore di inferenza è una forma di macchina a stati finiti che consiste in tre azioni: corrispondenza, selezione ed esecuzione di regole." Le regole sono semplicemente una combinazione di risoluzione dell'overload delle funzioni e dichiarazioni di funzioni e tipi nel programma. Nessun argomento che sia primitivo, ovviamente. –

3

Qui prenderò un punto di vista di minoranza. Se usi già la spinta, usare gli operatori boost non è un grosso problema. Potrebbe essere il modo corretto e testato di fare cose, ma l'aggiunta della dipendenza di boost solo per gli operatori è un eccesso.

E 'possibile scrivere programmi complessi C++ senza spinta (che io personalmente trovo esteticamente sgradevole) e così per mantenerlo semplice (stupido), per rispondere alla domanda di OP, se sovraccaricate operator ==, si dovrebbe anche sovraccaricare operator !=. Lo stesso vale per <, >, ++ ecc.

+2

Se non ti piace aumentare, per qualsiasi ragione, ciò non significa che non puoi usare la stessa tecnica. La mia risposta contiene un link a un singolo header autonomo che ho scritto come esempio di come fare esattamente questo in questo caso. –

+0

Sto solo rispondendo alla domanda - C++ non chiama automaticamente 'operator ==' e inverte il risultato quando '! =' Non è definito. Non contestando che esiste un modo automagico per farlo. –

1

Sì, è necessario sovraccaricare tutti gli operatori che si desidera utilizzare come li si definisce - C++ non prenderà la decisione che descrivi sopra; tuttavia, tieni presente che se il motivo per cui stai sovraccaricando è quello di ordinare la tua classe, devi solo ignorare gli operatori utilizzati dalla routine di ordinamento. Nel caso dell'algoritmo di ordinamento RTL è sufficiente eseguire l'override di < e =.

0

È possibile utilizzare l'overloading per utilizzare nomi definiti dall'utente. Sovraccarico dell'operatore significa utilizzare lo stesso operatore per eseguire operazioni su diversi articoli che non sono in quella categoria. Sovraccarico di funzioni significa utilizzare lo stesso nome di funzione ma argomenti diversi, in modo da superare l'overhead quando la stessa funzione viene chiamata durante il looping.

0

C++ non definisce, come lingua, alcun operatore in termini di qualsiasi altro operatore sovraccarico. Solo perché hai operator+, non significa che ottieni operator+= gratuitamente (a differenza di Ruby e Scala). Solo perché hai l'operatore < e == non significa che ottieni <= gratuitamente. Solo perché hai l'operatore == non significa che ottieni != gratuitamente (a differenza di Ruby e Scala). Solo perché hai unario operator * (unario) non significa che ottieni operator -> gratuitamente.

(se importato correttamente) e fornire definizioni predefinite e Boost fornisce alcuni mix-in che definiscono tutti gli operatori di confronto in termini di < e ==.