Errores, fallos, preguntas - página 2359

 
A100:

Lo he comprobado especialmente para ti, teniendo en cuenta

Está bien DJ.

¿Qué compilador utiliza?

Estoy en VS 2010:

binario '=' : no se ha encontrado ningún operador que tome un operando a la derecha de tipo 'A' (o no hay ninguna conversión aceptable)

p.d. No entiendo muy bien qué significa "con consideración". Se trataba de la aceptabilidad de copiar implícitamente una clase base en una clase derivada.

 

En Visual Studio, mi ejemplo también funciona. Me refería al operador de copia explícita y lo explicaba con el código.

Lo escribí por si acaso, para que si desactiva el explícito, no lo desactive accidentalmente al mismo tiempo

 
A100:

En Visual Studio, mi ejemplo también funciona. Me refería al operador de copia explícita y lo explicaba con el código.

No me refería al operador explícito. Hablaba de la inadmisibilidad del operador implícito en este caso que llamaste "estrechez de miras" y no es así.

Si necesitas hacer una copia, primero debes hacer un casting explícito de b al tipo correcto en C++. Ya que tal copia es una violación de la encapsulación de objetos. Por eso, el tipo implícito debería estar completamente descartado.

 
A100:

Me refería a un operador de copia explícito y lo explicaba en código.

Por cierto, si la clase A también hereda de alguna clase X, entonces su clase B no está de ninguna manera protegida de copiar a X (estamos hablando de MQL). Tiene que escribir operadores para TODAS las clases padre.
 
A100:

Dudo que el compilador los separe (en el contexto del código) en explícitos e implícitos. De lo contrario, sería fácil arreglarlo

La cuestión es que un operador implícito siempre se corresponde con el tipo de un objeto. Es decir, si un objeto es de tipo B, su operador implícito es de tipo B&.
 

Por cierto, el tipo de operador parece estar bien

Primero busca el operador B::, si está ausente, entonces busca el operador A::, si está ausente allí también, entonces considera su deber cumplido y no hace nada (aunque el puntero se rompa como resultado) :)

 
Ilya Malev:

si tampoco está, entonces considera su deber cumplido y no hace nada (aunque el puntero acabe roto) :)

¿Por qué no hace nada? Copia por el operador implícito (automático) operator=(const A&), lo que no debería hacer.

Y por último quitar ese asterisco después de la B, hace daño a la vista ) Ya lo hemos solucionado todo con este fallo.

 
Alexey Navoykov:

Y por último quita ese asterisco después de la B, hace daño a la vista ) Ya se ha dado cuenta de todo con este bicho.

Personalmente, las variables de los objetos sin asteriscos me resultan molestas )) Uno de los errores desagradables es escribir A a=new A en lugar de *a y no entender lo que está mal durante mucho tiempo) Yo, por el contrario, demostré que todo funciona correctamente si sigues tu consejo y declaras un op.=& privado. El editor producirá un error en este caso de inmediato. Lo haré así a partir de ahora ))

 
Pasé unas horas buscando discrepancias. Encontré esto
#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  const double Koef =  0.25;
  const int iDelta = 32;
  const double point = 0.00001;
  
  const double high = 1.06736;
  const double low = 1.06676;
  
  const double Avg = (high + low) * 0.5;  
  const double Size = (high - low) * Koef * 0.5;  
  
  PRINT(DoubleToString(Avg - Size - point * iDelta, 5));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT(DoubleToString(Avg - (Size + point * iDelta), 5)); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


Las peculiaridades se conocen doblemente, pero no de tal manera que si se cambia el orden de la suma (salvo los números relativamente muy diferentes), ¡el resultado es diferente! Por favor, explique a un tonto por qué sucede esto aquí.

Sólo hay que mirar las dos últimas líneas de la fuente.

 

Error para los desarrolladores.

El script no compila, identifique por qué)). Utilice el archivo adjunto.


El mismo archivo:


Archivos adjuntos:
Test1.mq5  9 kb