Discusión sobre el artículo "Interfaces gráficas XI: Integración de la librería gráfica estándar (build 16)" - página 8

 
Pavel Kolchin:

Intenté cambiar el archivo ElementBase.mqh, y me regaña aún más.

Es necesario cambiar tanto ElementBase.mqh como Element.mqh.

 
MetaQuotes Software Corp.:

En versiones recientes, hemos añadido un mensaje al compilador para aquellos casos en los que un método ancestro está sobrecargado en un descendiente:

Ejemplo

En este caso, la función func(int) del ancestro SFoo se llama en la clase descendiente SBar porque el compilador no la ha encontrado en el descendiente. El descendiente sólo tiene la función func(double) y el compilador intenta encontrar una función con un parámetro adecuado en el árbol de herencia.

Es decir, el compilador MQL5 realiza la sobrecarga en lugar de sobrescribir el método en el descendiente. Al principio del desarrollo del lenguaje, esta relajación del compilador MQL5 no se consideró crítica. Pero en el futuro puede cambiar, por lo que ahora se hace una advertencia explícita a los desarrolladores de programas MQL5 para que lo tengan en cuenta y corrijan sus códigos.

Estrictamente hablando, overriding es un concepto un poco más amplio, puede buscar la diferencia entre overloading y overriding en Internet
.

1. Es correcto que dicho código no se compile?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // no compilará sin esta línea
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}
'CA::func' - cannot access private member function      TestCompiler.mq5        27      18
   see declaration of 'CA::func'        TestCompiler.mq5        13      8
1 error(s), 0 warning(s)                2       1


2. ¿Es correcto que este código, además del error mencionado, genera la advertencia "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // no compilará sin esta línea
                bool func( int a ) { return(true); };
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}

 
Andrey Khatimlianskii:

1. ¿Es correcto que dicho código no se compile?


2. ¿Es correcto que este código, además del error anterior, genera la advertencia "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?


Quizás sea mejor preguntar esto en el hilo sobre la nueva versión del terminal? ) Creo que van a responder más rápido allí )

La advertencia parece encajar en la nueva lógica del compilador, pero no entiendo lo del miembro privado, sigue siendo público...

 
Oleksii Chepurnyi:

Es necesario modificar ElementBase.mqh y Element.mqh

En ElementBase.mqh está claro, has sustituido "Is" por "Set" (pero no está claro por qué podemos hacer eso).

virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
bool              IsAvailable(void)                         const { return(m_is_available);               }

pero en Element.mqh hay otra linea

//--- Disponibilidad del artículo
virtual void      IsAvailable(const bool state);
 
Pavel Kolchin:

En ElementBase.mqh está claro, has sustituido "Is" por "Set" (pero no está claro por qué podemos hacer eso)

pero en Element.mqh hay otra línea

Bueno ahora a MQ no le gustan los mismos nombres (variables, métodos, etc) :)

Sólo cambiamos el nombre del método (¿y por qué no? ) )

No queremos cambiar nada - esperamos a que el autor rehaga todo )

 
Oleksii Chepurnyi:

El autor es probablemente "terminado" con este proyecto, puede especificar en qué líneas lo que debe escribir para que el compilador no jurar, y mejor, por supuesto, ortodoxa (corregido) archivos ( ElementBase.mqh y en Element.mqh) para la gente

 

1. Ahora mismo estoy en medio de otro proyecto.

2. He cambiado mucho la librería )

Bueno, además de los cambios en ElementBase.mqh y Element.mqh deberías revisar todos los elementos, quizás allí también estén estos métodos.

 
Oleksii Chepurnyi:

¿Quizás sea mejor preguntar en el hilo sobre la nueva versión del terminal? ) Creo que allí contestarán más rápido )

La advertencia parece encajar en la nueva lógica del compilador, pero no entiendo lo del miembro privado, sigue siendo público...

He encontrado una solución:

Foro sobre el comercio, los sistemas automatizados de comercio y la prueba de estrategias de negociación

Nueva versión de MetaTrader 4 build 1170

fxsaber, 2019.09.06 09:39 pm.

Creo que la opción propuesta en MT5 es una innovación que debería añadirse también a MT4.

Pero si escribes el código a la vieja usanza, funcionará en todas partes.

     void           Test(const bool test){((A)b).Test(test);}

Así es como funciona mi ejemplo:

CC(void) { ((CA)m_b).func(); }


Pero esto no es una solución, por supuesto.

 

@Ilyas, ¿no hay opción sin conversión a CA?

 
Andrey Khatimlianskii:

@Ilyas, ¿no hay opción sin conversión a CA?

1. tu herencia es privada

class CB : CA

2. aviso correcto, según las normas ahora es así:

CC(void) { m_b.CA::func(); }