Si può scambiare la direzione di e sovraccarichi per definirli come membri della classe?

4

Alcuni operatori non possono essere sovraccaricati come membri della classe. Uno di questi esempi sono gli operatori di spostamento bit a bit utilizzati per gli stream vedere qui per esempio . La ragione di ciò (a quanto ho capito) sembra essere che l'operando del sito di sinistra è quello per cui si definisce il comportamento e non è possibile definire il comportamento per i flussi integrati. Per favore correggimi se sbaglio.

Penso che sarebbe utile definire questi sovraccarichi come membri della classe, perché probabilmente hanno bisogno di accedere ai dati privati. Certo, c'è friend , ma sembra essere più una soluzione alternativa.

Questa è più una domanda ipotetica, ma perché non scambiare il significato di >> e << quindi?

obj >> std::cout;
obj << std::cin;

In questo modo, l'intera operazione avviene dal punto di vista dell'oggetto, non del flusso. Il sovraccarico può essere eseguito come una funzione membro, poiché l'oggetto è l'operando sulla sinistra. Sarebbe possibile?

Suppongo che ci siano molte cose che potrebbero rompersi, come la leggibilità per i principianti dato che tutti sono abituati all'altra direzione. Quali altre cose farebbe questa pausa?

    
posta null 30.10.2016 - 18:55
fonte

3 risposte

5

I sovraccarichi dell'operatore in C ++ sono zucchero sintattico , niente di più. Il tuo esempio funzionerà bene: tuttavia, considera due cose. In primo luogo, in che modo le persone si aspettano che gli operatori di streaming (operatori tecnicamente bitshift) funzionino? Si aspettano che possano essere incatenati : la seconda idea da considerare è come funziona il tuo esempio con il concatenamento?

Dato questo codice:

std::cout << obj1 << obj2 << std::endl;

Ciò che sta realmente succedendo è questo, una volta rimosso lo zucchero sintattico:

std::cout.operator<<(obj1).operator<<(obj2).operator<<(std::endl);

Ricorda che operator<<() restituisce un riferimento a *this per convenzione (true nella libreria standard e una buona idea in generale per consentire di concatenare gli operatori in questo modo). Ciò significa che tutte queste chiamate sono invocate su std::cout , il primo oggetto a cui si fa riferimento in quella dichiarazione.

Ora considera il tuo esempio:

obj >> std::cout;

Se lo estendi per concatenare più oggetti, potresti ottenere questo:

obj1 >> obj2 >> std::cout;

Che assomiglierebbe a questo se convertito in chiamate di funzioni appropriate:

obj1.operator>>(obj2).operator>>(std::cout);

Ciò significa che sì, è possibile invertire l'ordine, ma si romperà e non si comporterà come i programmatori C ++ si aspettano una volta che si concatenano più funzioni insieme.

    
risposta data 30.10.2016 - 19:16
fonte
3

Scambiare la direzione degli operatori I / O per spostare gli operandi sul lato sinistro sarebbe tecnicamente possibile, ma il "concatenamento" che viene spesso utilizzato per lo streaming I / O sarebbe quantomeno ingombrante. Invece di

std::cout << "The result is " << result << endl;

dovresti scrivere o

"The result is " >> std::cout;
result >> std::cout;
std::endl >> std::cout;

o

std::endl >> (result >> ("The result is " >> std::count));

che sembra innaturale.

    
risposta data 30.10.2016 - 19:13
fonte
1

Insieme con i problemi già citati (che per lo più si riducono alla mancanza di concatenamento), qui c'è un altro problema fondamentale. Considera cosa succede se provi a lavorare con un tipo integrato nel compilatore:

int x;

x << std::cin;

In mancanza di una funzione libera sovraccaricata per eseguire il lavoro, questo proverebbe a fare x.operator<<(std::cin); . Poiché x è di tipo int , non contiene e non può contenere operatori sovraccaricati.

Quindi, per tutti i tipi built-in, dovresti ancora implementare il sovraccarico come una funzione libera come fai adesso, oppure creare wrapper come Integer di Java solo per gestire questi sovraccarichi. Né sembra (almeno per me) fornire alcun significativo miglioramento rispetto alla situazione attuale.

    
risposta data 31.10.2016 - 23:02
fonte

Leggi altre domande sui tag