Errores, fallos, preguntas - página 1357

 
Por cierto, no entiendo este código, ¿dónde se llamará operator==? Sólo compara dos longs, eso es todo
 
Alexey Navoykov:
Por cierto, no entiendo este código, ¿en qué lugar se llamará a operator==? Es sólo una comparación de dos longs, eso es todo
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 puede ser una plantilla o una función general similar a ::GetPointer
 
A100:

...

IsEqualPointer puede ser un patrón o una función general similar a ::GetPointer

No te entiendo nada, ¿podrías explicar en lenguaje humano lo que intentas hacer? El código dado tiene errores (operator== no tiene ni argumento, ni valor de retorno), es difícil entender algo de todo esto.

Permítanme decirles de entrada que el problema de comparar/asignar punteros no ha existido nunca, para ello basta con GetPointer(a)==GetPointer(b). Así pues, la tarea se refiere únicamente a la comparación/asignación de los propios objetos, es decir, se garantiza que estas operaciones se realicen, independientemente de que estos objetos estén representados por punteros o referencias

 
Alexey Navoykov:

El código que has dado tiene errores (operator== no tiene argumento ni valor de retorno), es difícil entender nada de todo esto.

Corregido. Se sugiere llamar a operator==(...) para los punteros también, si se define, entonces GetPointer(a)==GetPointer(b) hará que se llame a.operator==( b ), por lo que para comparar punteros para la igualdad se sugiere usar IsEqualPointer
 
A100:
GetPointer(a)==GetPointer(b) hará que a.operator==( b )
¿Por qué iba a hacer eso?
 
Alexey Navoykov:

Por cierto, qué tal si se introducen los operadores * y & en MQL para permitir el acceso explícito a un objeto en el primer caso, y tomar un puntero de objeto en el segundo (en lugar del engorroso GetPointer). El asterisco es imprescindible, y no hay nada en el lenguaje que lo sustituya.Sin ella, es imposible controlar situaciones como la descrita por A100 más arriba, cuando en lugar de los propios objetos se realizan acciones de puntero. Personalmente, esto es un problema constante, tengo que estar constantemente en alerta o especificar A.operator=(B), A.operator!=(B) en todas partes, es decir, se pierde la brevedad, y la sobrecarga de operadores en realidad carece de sentido.

Ya planteé este problema una vez, pero el tema se estancó. Terminemos de una vez este asunto.

Gracias por el mensaje, si te refieres al siguiente uso:
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

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

Estoy de acuerdo con eso, ciertamente plantearé el tema y lo discutiremos.
 
Alexey Navoykov:
¿Por qué?
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<
}
Si se equipara operator== con operator<, el resultado es el mismo
 
A100:
...
Si se equipara operator== con operator<, el resultado también será el mismo.

Ni siquiera has comprobado lo que sugieres! Al igual que en el caso anterior, cuando había errores obvios en el código, es decir, ni siquiera intentaste compilarlo. Esbozaste algo en una manivela, algunos pensamientos tuyos, como "cómetelo mientras sea amable, sin piedad"... ¿Es eso cierto? No hagamos este tipo de tonterías.

Yo mismo comparo constantemente los punteros y los operadores de sobrecarga, y nunca ha ocurrido lo que sueñas ahora. Y ahora habiendo comprobado tu código, no ha ocurrido ningún milagro, el operador== no se ejecuta como debería.

 
Alexey Navoykov:

Así que ahora habiendo revisado tu código, no ha ocurrido ningún milagro, el operador== no se inicia como debería.

La esencia de la propuesta es precisamente que se ejecute. Hablo de cambios en el sistema existente.
 
A100:
El objetivo de la sentencia es precisamente que se active.

¿Para qué es eso? Está al revés.

Tiene más sentido al revés: < y > deberían provocar la comparación de punteros.

Razón de la queja: