Newsgroup: it.comp.lang.c++
Titolo: Overloading di <= fra oggetti String

Deitel, pag. 491
Ho una classe String e una funzione di ridefinizione dell'operatore <= :
class String{
//...
public:
	bool operator<= ( const String &right ) const
	{ return !( right < *this ); }
//..
};
Non ho capito come possa la relazione (right < *this) determinare la 
condizione <= .
Grazie

condizione <= .
Perché (lhs <= rhs) equivale a !(lhs > rhs)

 Perché (lhs <= rhs) equivale a !(lhs > rhs)
Non comprendo come un confronto fra due deferenziazioni di puntatori 
possa determinare se la stringa è più grande o più piccola.
Non funziona:
#include <iostream>
int main()
{
    char* s1 = "Rho";
    char* s2 = "Domodossola";
    if ( *s1 > *s2 )
       std::cout << "s1 maggiore di s2\n";
    else
       std::cout << "s2 minore o uguale di s1\n";
}
L'output è:
s1 maggiore di s2


Non è un confronto fra due puntatori, ma fra due oggetti di tipo
'String'.
In effetti, l'autore usa la funzione membro 'bool String::operator<
( const String &right ) const' per implementare una nuova funzione
membro 'bool String::operator<= ( const String &right ) const'.
All'interbo della funzione, 'right' è l'oggetti String passato come
argomento, ' *this ' è l'oggetto String sulla quale venga chiamata la
funzione.
Dunque:
    String s1, s2;
    s1 <= s2;
' *this ' referisce a s1, 'right' a s2.
Saluti.

     char* s2 = "Domodossola";
Non cambiare le carte in tavola: nel messaggio precedente parlavi di
stringhe (quindi suppongo std::string), *NON* di puntatori. Per le
std::string vale il confronto diretto. E' ovvio che confrontare i
puntatori è un conto, confrontare i valori puntati è un altro; e per
confrontare i valori puntati, trattandosi di stringhe "a la C", in C++
bisogna ugualmente usare strcmp() (v. string.h). Lasciatelo dire: hai
moltissima confusione su concetti di base.

 s1 maggiore di s2
E tu cosa ti aspettavi, invece?
*s1 è il primo carattere di s1, cioè 'R'. *s2 è 'D'. Da che mondo è 
mondo 'R'>'D'.
E.

 moltissima confusione su concetti di base.
Infatti ho deciso di mollare, troppo complicato per me.
Grazie comunque.

 Infatti ho deciso di mollare, troppo complicato per me.
Senza offesa, ma secondo me non ti sforzi di capire o, meglio, non hai
voglia di capire. Ti arrendi troppo facilmente. La confusione si cura:
basta chiarire i concetti. Il C++ è sicuramente un linguaggio
complesso, ma non sono questi gli argomenti che lo rendono complesso.
Mi sembra strano che tu trovi confusione su un concetto semplice come:
"(a <= b) equivale a (!(a>b))"
O che non riesca a capire che l'oggetto String citato nell'esempio non
è, evidentemente, un puntatore a char.

 Grazie comunque.

 č, evidentemente, un puntatore a char.
Quella relazione mi era chiara...deriva dall'algebra degli insiemi.
Vorrei capire qualcosa di piů proprio sugli oggetti, come vengono 
gestiti in memoria ecc.
Sul libro vengono trattati, giustamente, a un livello di astrazione 
superiore, ma vorrei capire un po' dietro cosa c'č.
Provo a cercare un po' con Google.
Grazie comunque.

 gestiti in memoria ecc.
C'è un libro di Stanley Lippman che può esserti d'aiuto: "Inside the C+
+ Object Model".
E' piuttosto vecchiotto (1995) e non so se riesci a recuperarlo in
edicola.
Su Amazon c'è: 
http://snipurl.com/2yeht
Comunque non aspettarti che dietro gli oggetti ci sia chissà cosa. In
sostanza si tratta solo di qualcosa di molto analogo alle strutture.
L'unico elemento di complessità è introdotto dal polimorfismo.

 caratteristiche più avanzate ?
Il fatto è che quelle di cui si è parlato finora non sono affatto
caratteristiche "avanzate". Almeno non per come intendo io le
caratteristiche avanzate di un linguaggio in generale e del C++ in
particolare. Se si ha difficoltà a capire questi concetti basilari,
allora figuriamoci certi temi legati alla programmazione generica.
Insomma, il C++ è difficile, ma la percezione della sua difficoltà
dovrebbe arrivare solo a certi stadi.