Preguntas sobre POO en MQL5 - página 43

 
Igor Makanu:

SZS: Tus posts son casi siempre razonables, pero la presentación del material, bueno, no exactamente con buenas intenciones, por supuesto tu negocio, pero imho, quieres ayudar - ayudar, quieres ser inteligente, bueno, a menudo resulta así

El lanzamiento te hace pensar... escribiste que habías empezado a pensar en el código, y que antes codificabas a las primeras de cambio...

 
A100:

El lanzamiento te hace pensar... escribiste que comenzaste a pensar en el código, y antes de eso estabas codificando con prisa.

hmm... Bueno, ¡nunca he escrito un doddle! - ¡es un hecho!

SZZY: Actualizo el tema periódicamente, no por ignorancia o porque no pueda encontrar el material por mí mismo, sino porque hay un activo, que me interesa ;)

¡ZSYS: el resultado de la comunicación - más bien repensado por qué utilizar modificadores, por qué necesitamos un get / set - ahorra tiempo en la etapa de desarrollo, con el hábil uso del compilador, probando el código escrito será inmediatamente exitosa - aquí realmente abrió los ojos, que era un activo en el tema, una vez más, gracias!

 
Koldun Zloy:

He aquí un ejemplo:

A partir de tu código, no está claro para qué sirve la interfaz, así que la he desechado.

Por supuesto que no conozco completamente su tarea, pero hay un 99,99% de posibilidades de que no sea necesario.

Malvado...

 
Igor Makanu:

Um... ¡Nunca he escrito de forma borrosa! - ¡es un hecho!

SZZY: Actualizo periódicamente este tema no por ignorancia, o porque no pueda encontrar material por mi cuenta, sino porque hay un activo, cuya opinión me interesa ;)

¡SZZY: el resultado de la comunicación - más bien repensado por qué utilizar modificadores, por qué necesitamos un get / set - ahorra tiempo en la etapa de desarrollo, con el uso hábil del compilador, probando el código escrito será inmediatamente exitosa - aquí realmente abrió los ojos, que era un activo en el tema, una vez más, gracias!

Es muy bueno que hayas aprendido algo. Pero se puede avanzar mucho más si se lee el C++ de Stroustrup.

Pero es mejor que no leas artículos y varios vídeos sobre Habra. Cualquiera puede escribir allí. Sólo te confundirán.

 

Ha surgido una pregunta.


Hay un panel con botones, cada botón ejecutará algunas funciones. Las funciones llamadas al presionar uno de los botones, llamémoslo Exit1, deben colocarse en una clase separada CExit1.

Pero estas funciones utilizan algunas variables globales y métodos de otros objetos.

No he participado en grandes proyectos. Me gustaría conocer la opinión de un experto, ¿cómo hacerlo correctamente?

Suelo programar de tal manera que si se compila un archivo mq4, todas las clases y archivos de inclusión se cargan sin errores y el EA funciona correctamente. Sin embargo, si compilo una clase por separado, recibo advertencias porque algunas variables y funciones externas no son visibles.

Esta es mi pregunta. ¿Una clase tiene que compilar por sí misma sin errores, es decir, tiene que contener todas las copias de las variables globales de EA, referencias a objetos, etc. que se utilizan? Si es así, ¿cuándo sería el mejor momento para hacerlo? Si hay muchos objetos que interactúan, ¿cómo organizarlos para que haya menos confusión? ¿Crea usted diagramas de sus programas si estos proliferan?

Comparta cómo escribe y ejecuta el trabajo con sus objetos.

 
Vasiliy Pushkaryov:

Ha surgido una pregunta.


Hay un panel con botones, cada botón ejecutará algunas funciones. Las funciones llamadas al presionar uno de los botones, llamémoslo Exit1, deben colocarse en una clase separada CExit1.

Pero estas funciones utilizan algunas variables globales y métodos de otros objetos.

No he participado en grandes proyectos. Me gustaría conocer la opinión de un experto, ¿cómo hacerlo correctamente?

Suelo programar de tal manera que si se compila un archivo mq4, todas las clases y archivos de inclusión se cargan sin errores y el EA funciona correctamente. Sin embargo, si una clase se compila por separado, pueden aparecer algunas advertencias, porque algunas variables y funciones externas no son visibles para la clase.

La pregunta es. ¿Es necesario que la propia clase compile sin errores, es decir, que ya contenga todas las copias usadas de las variables globales, referencias a objetos, etc.? Si es así, ¿cuándo sería el mejor momento para hacerlo? Si hay muchos objetos que interactúan, ¿cómo organizarlos para que haya menos confusión? ¿Crea diagramas de sus programas si proliferan?

Comparta cómo escribe y ejecuta el trabajo con sus objetos.

Las variables globales y las estadísticas, salvo las inherentes a la plataforma, son una cosa mala. Y todas las entidades (grupos de clases) deben estar aisladas y comunicarse entre sí según un protocolo (el de la Interfaz) y nada más.

Esto es, por supuesto, lo ideal :-) En la vida real tú tomas la decisión y te apoyas, porque nadie más conoce tu proyecto, tu idea y tu estilo.

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   //b = c = a;  //'operator=' - parameter passed as reference, variable expected
}

1. ¿por qué no compila?

2. ¿existe un hack para describir operator= , y utilizar el operador de copia nativo en él? .... es decir, alguna forma de llamar a::=

 
Igor Makanu:

1. ¿por qué no compila?
2. ¿existe un hack para describir el operador= , y utilizar el operador de copia nativo en él? .... es decir, alguna forma de llamar a ::=

1) el operador de asignación por defecto en MQL devuelve el tipo de datos void;
2) puedes hacer algo así:

struct A{
   int x,y;
   
   A(){}
   A(const A &a){
      this.x = a.x;
      this.y = a.y;
   }
   A operator=(const A &a){
      this.x = a.x;
      this.y = a.y;
      return a;
   }
};

void OnStart(){
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik:

1) el operador de asignación por defecto en MQL devuelve el tipo de datos void;

no están de acuerdo:

struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc(const int size)
{
   A result;
   ArrayResize(result.x, size);
   for(int i = 0; i < size; i++) result.x[i] = i + 1;
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   a = myfunc(5);
   A b;
   b = a;            // скопировали
   b.x[0] = 99;      // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint(a.x);
   ArrayPrint(b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99 2 3 4 5


Está claro que el operador de asignación por defecto devuelve el tipo de dato completo y hace una copia, ¿o de qué vacío estamos hablando?


2. el ejemplo es bueno, pero quiero conservar la posibilidad de copiar en estructuras de arrays mediante el operador de copia por defecto - lo he comprobado, en general funciona bastante bien con arrays dinámicos, hay un par de matices, pero la cuestión es otra por ahora

 
Igor Makanu:

El operador de asignación por defecto devuelve claramente el tipo de dato completo y hace una copia, ¿o de qué vacío estamos hablando?

No es así.

Sólo tiene que definir su operador=, que devuelve esto, y verá la diferencia.

Se puede ver cuando el resultado de la asignación se asigna de nuevo.

struct A
{
   int x;
   int y;
   
   A operator=( const A& a )
   {
      x = a.x;
      y = a.y;
      
      return this;
   }
};

void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;
}