Discusión sobre el artículo "Las bases de la programación orientada a objetos" - página 3

 

1) pensé que había un error aquí:

Sección: Pasar parámetros al constructor

"La función Init() está apartada en la sección privada para asegurar que la clase puede ser reiniciada".

posible:

La función Init() se aparta en la sección pública para ofrecer la posibilidad de reinicializar la clase.

2) Por favor, proporcione un ejemplo de uso de la función"crear una matriz con instancias de clase (objetos)" para la sección "Matriz de objetos". Lamentablemente, no consigo entender "para qué se utiliza".

3) En la sección "Más sobre encapsulación (private, protected, public)", se menciona de pasada la descendencia clase base->clase. Quizás este dato(clase Class: public CBase) debería explicarse al principio de la sección, porque me he dado cuenta más tarde.

4) no encontré:Fig.6. La visibilidad de la función "extra" (flecha roja) viene determinada por el tipo de puntero con el que se carga la clase. Este ejemplo se encuentra en el apéndice en el archivo OOP_sDefaultVirtual_1.mq5.

5) No he encontrado una indicación clara de lo que es una biblioteca. Aparentemente, ¿una forma de almacenar la(s) clase(s) de las funciones? es decir, similar al archivo de inclusión, sólo que el archivo de inclusión se almacena como una fuente, y la biblioteca como una dll compilada?

Muchas gracias por el artículo. Me ha gustado especialmente la presentación coherente del material.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) pensé que había un error aquí:

Sección: Pasar parámetros al constructor

"La función Init() está apartada en la sección privada para asegurar que la clase puede ser reiniciada".

posible:

La función Init() se aparta en la sección pública para ofrecer la posibilidad de reinicializar la clase.

2) Por favor, proporcione un ejemplo de uso de la función"crear una matriz con instancias de clase (objetos)" para la sección "Matriz de objetos". Lamentablemente, no consigo entender "para qué se utiliza".

3) En la sección "Más sobre encapsulación (private, protected, public)", se menciona de pasada la descendencia clase base->clase. Quizás este dato(clase Class: public CBase) debería explicarse al principio de la sección, porque me di cuenta más tarde.

4) no encontré:Fig.6. La visibilidad de la función "extra" (flecha roja) viene determinada por el tipo de puntero con el que se carga la clase. Este ejemplo se encuentra en el apéndice en el archivo OOP_sDefaultVirtual_1.mq5.

5) No he encontrado una indicación clara de lo que es una biblioteca. Aparentemente, ¿una forma de almacenar la(s) clase(s) de las funciones? es decir, similar al archivo de inclusión, sólo que el archivo de inclusión se almacena como una fuente, y la biblioteca como una dll compilada?

Muchas gracias por el artículo. Me ha gustado especialmente la presentación coherente del material.

1. Sí.

2. Hay un ejemplo en la sección "Array de objetos", en realidad toda la sección es un ejemplo con una descripción.

3. Se considera en la sección "Uso de la POO para cambiar la lógica de funcionamiento del programa".

4. Las palabras "Este ejemplo se encuentra en el apéndice del fichero..." significa que el fichero contiene un ejemplo para la sección indicada por la cabecera de la sección. Esto no significa que los ejemplos dupliquen todo lo escrito en el artículo. Estos ejemplos pueden no existir en absoluto, todo está escrito en el artículo. Pero los ejemplos están ahí, puedes tomarlos como base y experimentar. El artículo es primario, los ejemplos son secundarios.

5. Уже давно указано: http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

[Eliminado]  
gracias. buen articulo.
[Eliminado]  

Artículo muy interesante, escrito en un lenguaje competente y "accesible".

Gracias al autor.

 
Gracias. Este artículo me ayudó mucho. Estaba migrando mi EA a OOP y tenía un problema especial con los arrays de clases. Los punteros dinámicos están clara y perfectamente explicados. Gracias de nuevo.
 
Un artículo muy bien escrito! Por fin me he dado cuenta gracias al autor.
 

Tengo dos ejemplos de código basados/copiados de este artículo. Ambos crean un array de punteros a una clase y luego los borran al salir. Sin embargo, uno sale con una fuga de memoria y el otro sale sin fuga de memoria. La única diferencia es que el segundo ejemplo tiene la "alerta" en el destructor comentada. Cuando se elimina la alerta en el destructor se produce una fuga de memoria. Esto es muy extraño. ¿Alguien puede explicarlo? Por favor, ayuda, esto me está volviendo LOCO.

Al final de los ejemplos de código de este artículo he incluido un ejemplo extremadamente simple de código que escribí que también tiene una fuga de memoria. De nuevo, por qué???? No hay nada complicado en este ejemplo final de código...


Este código funciona sin fugas de memoria:

class CName
  {
private:
   int               m_arg; // Variable para la instancia
public:
                     CName(int aArg)
     { // Constructor
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Destructor
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // Matriz

void OnInit()
  {
// Preparar array para cargar diez instancias de clase
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Cargar instancias
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // Al final descarga todas las instancias de la memoria
      delete(cname[i]);
     }
}

Mensajes del registro de expertos, no hay fugas de memoria:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 2

ES 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 9

¡¡¡¡Este código sale CON una fuga de memoria!!!! Por qué????????? La única diferencia es comentar el 'Alert' en el destructor...

class CName
     {
private:
   int               m_arg; // Variable para la instancia
public:
                     CName(int aArg)
     { // Constructor
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Destructor
      //Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // Matriz

void OnInit()
  {
// Preparar array para cargar diez instancias de clase
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Cargar instancias
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // Al final descarga todas las instancias de la memoria
      delete(cname[i]);
     }
}

Mensajes del registro de expertos, observe la fuga de memoria:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 Quedan 10 objetos sin borrar

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 Quedan 10 objetos de tipo CName

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 bytes de memoria filtrada

Ejemplo final , mi código, muy simple pero sale con una fuga de memoria....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

Mensajes del log del experto, observe la memoria filtrada:

MR 0 tester (EURUSD,M1) 14:07:23 Last Error- 0 Hora actual: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 Quedan 10 objetos sin borrar

KN 1 tester (EURUSD,M1) 14:07:23 Quedan 10 objetos de tipo CCandleStick

JS 1 tester (EURUSD,M1) 14:07:23 160 bytes de memoria filtrada



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

Tengo dos ejemplos...

Comprobados los tres varaints. Los tres son idénticos. Todos son normales. Ninguno da fugas. En estos ejemplos, no puede ser - tenemos el array, en cada elemento del array tenemos instancia, al terminar borramos todos los objetos. Los objetos no crean copias de sí mismos, no se puede perder para eliminar samething. Si el objeto crea una copia de sí mismo, entonces podemos tener dificultades con la eliminación, muy fácil de perder algo. Mostrar variantes que realmente tienen fugas.

Utilice el botón SRC para insertar código (mejor - adjuntar archivos).

Lo siento por mi Inglés:)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
La programación orientada a objetos es un lenguaje de programación moderno, pero para entenderlo y escribir código necesitamos mucho tiempo y dedicación. Gracias buen artículo
 
Integer:

Comprobados los tres varaints. Los tres son idénticos. Todos son normales. Ninguno da fugas. En estos ejemplos, no puede ser - tenemos el array, en cada elemento del array tenemos instancia, al terminar borramos todos los objetos. Los objetos no crean copias de sí mismos, no se puede perder para eliminar samething. Si el objeto crea una copia de sí mismo, entonces podemos tener dificultades con la eliminación, muy fácil de perder algo. Mostrar variantes que realmente tienen fugas.

Utilice el botón SRC para insertar código (mejor - adjuntar archivos).

Lo siento por mi Inglés:)

Muchas gracias por tomarse el tiempo para responder. No estoy seguro de que viste mi pregunta de seguimiento. Fue en un comentario separado que probablemente fue borrado porque no estoy muy familiarizado con este foro. Sin embargo, he intentado ejecutar los tres ejemplos en un equipo antiguo con una versión anterior de MetaTrader. En la versión anterior de los 3 parecía funcionar bien. No generó un registro de expertos 'fuga de memoria' error, creo que fue construir 560??Creo que era la build 560?? no lo recuerdo y actualicé la 560 a la nueva build 756. Después de la nueva build tengo los mismos problemas de fuga de memoria. ¿Es posible que la antigua build no informara de los problemas de fuga de memoria porque no era una característica? ¿Qué build estás utilizando? Gracias de nuevo.