Errori, bug, domande - pagina 1357

 
A proposito, non capisco questo codice, dove sarà chiamato operator==? Semplicemente confronta due longs, tutto qui
 
Alexey Navoykov:
A proposito, non capisco questo codice, in quale posto sarà chiamato operator==? È solo un confronto tra due longs, tutto qui
class A { public:
        bool operator==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
void OnStart()
{
        bool res;
        A *a1, *a2;
        B *b1, *b2;
        res = a1 == a2; //сейчас сравниваются указатели
                        //предлагается вызывать operator==()
        res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
        res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
IsEqualPointer può essere un modello o una funzione generale simile a ::GetPointer
 
A100:

...

IsEqualPointer può essere un modello o una funzione generale simile a ::GetPointer

Non ti capisco per niente, potresti spiegare in linguaggio umano cosa stai cercando di fare? Il codice dato ha degli errori (operator== non ha né argomento, né valore di ritorno), è difficile capire qualcosa da tutto questo.

Lasciate che vi dica subito che il problema di confrontare/assegnare i puntatori non è mai esistito prima, GetPointer(a)==GetPointer(b) è sufficiente per questo. Quindi il compito riguarda solo il confronto/assegnazione degli oggetti stessi, cioè è garantito per eseguire queste operazioni indipendentemente dal fatto che questi oggetti siano rappresentati da puntatori o riferimenti

 
Alexey Navoykov:

Il codice che hai dato ha degli errori (operator== non ha argomento o valore di ritorno), è difficile capire qualcosa da tutto questo.

Corretto. Si suggerisce di chiamare operator==(...) anche per i puntatori, se è definito, allora GetPointer(a)==GetPointer(b) causerà la chiamata di a.operator==( b ), quindi per confrontare i puntatori per l'uguaglianza si suggerisce di usare IsEqualPointer
 
A100:
GetPointer(a)==GetPointer(b) causerà a.operator==( b )
Perché dovrebbe farlo?
 
Alexey Navoykov:

A proposito, che ne dite di introdurre gli operatori * e & in MQL per permettere l'accesso esplicito a un oggetto nel primo caso, e prendere un puntatore a un oggetto nel secondo (invece dell'ingombrante GetPointer). L'asterisco è un must, e non c'è niente nel linguaggio per sostituirlo.Senza di esso, è impossibile controllare situazioni come quella descritta da A100 sopra, quando invece degli oggetti stessi vengono eseguite alcune azioni del puntatore. Personalmente, questo è un problema costante, devo stare costantemente all'erta o specificare A.operator=(B), A.operator!=(B) ovunque, cioè si perde la brevità, e l'overloading degli operatori diventa effettivamente senza senso.

Ho già sollevato questo problema una volta, ma l'argomento si è arenato. Finiamo finalmente questo problema.

Grazie per il messaggio, se intendi il seguente utilizzo:
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

*pf1!=*pf2
*pf1=*pf2;

Sono d'accordo, sicuramente solleverò la questione e ne discuteremo.
 
Alexey Navoykov:
Perché dovrebbe essere così?
class A { public:
        bool operator ==( const A& ) { Print( __FUNCSIG__ ); return true; }
        bool operator  <( const A& ) { Print( __FUNCSIG__ ); return true; }
};
void OnStart()
{
        bool res;
        A a1, a2;
        res = GetPointer( a1 ) == GetPointer( a2 ); //сейчас сравниваются указатели, а будет вызываться operator==, как сейчас происходит для следующей строки
        res = GetPointer( a1 )  < GetPointer( a2 ); //вызывается operator<
}
Se si equipara operator== con operator<, il risultato è lo stesso
 
A100:
...
Se equiparate operator== con operator<, anche il risultato sarà lo stesso.

Non hai nemmeno controllato quello che suggerisci! Proprio come nel caso precedente, quando c'erano errori evidenti nel codice, cioè non hai nemmeno provato a compilarlo. Hai abbozzato qualcosa su una manovella, qualche tuo pensiero, tipo "mangia finché sono gentile, senza pietà"... Non facciamo queste sciocchezze.

Io stesso confronto costantemente i puntatori e gli operatori di sovraccarico, e non è mai successo quello che stai sognando ora. E ora avendo controllato il tuo codice, non è successo nessun miracolo, operator== non viene eseguito come dovrebbe essere.

 
Alexey Navoykov:

Quindi ora, avendo controllato il vostro codice, non è successo nessun miracolo, l'operator== non parte come dovrebbe.

L'essenza della proposta è proprio quella di correre. Sto parlando di modifiche al sistema esistente.
 
A100:
Il punto della frase è precisamente che dovrebbe essere innescata.

A cosa serve? È sottosopra.

Ha più senso il contrario: < e > dovrebbero causare il confronto dei puntatori.