Preguntas sobre POO en MQL5 - página 72

 

Tengo algunos malentendidos con los punteros en MQL5 - una "cosa no especificada".

Me encontré con un problema con un script de prueba (he adjuntado la biblioteca):

este código borrará el puntero, todo está bien.

#include <JSON\json.mqh>

JSONObject * getJSONObject(const string json)
{
   JSONParser  parser;
   JSONValue*  jv;
   JSONObject* jo = jv = ((JSONParser)(parser)).parse(json);
   if (jv != NULL && jv.isObject()) return(jo);
   Print(__FUNCSIG__ + "parser error, json = ",json);
   delete jv; 
   return(NULL);
}
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj!=NULL) Print("m_period = ", jobj.getInt("m_period"));
   delete jobj; 
}

Al principio quería escribirlo así:

#include <JSON\json.mqh>

JSONObject * getJSONObject(const string json)
{
   JSONValue *jv =((JSONParser *)(new JSONParser())).parse(json);
   if (jv != NULL && jv.isObject()) return((JSONObject *)jv);
   Print(__FUNCSIG__ + "parser error, json = ",json);
   delete jv; 
   return(NULL);
}
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj!=NULL) Print("m_period = ", jobj.getInt("m_period"));
   delete jobj; 
}

al ejecutar el script, obtengo: 1 object of type JSONParser left


¿Cómo puedo eliminar este JSONParser fuera de la función?


Archivos adjuntos:
Include.zip  12 kb
 
Igor Makanu:

Tengo algunos malentendidos con los punteros en MQL5 - una "cosa no especificada".

Me encontré con un problema con un script de prueba (tengo la biblioteca adjunta):

este código borrará el puntero, todo está bien.

Al principio quería escribirlo así:

al ejecutar el script, obtengo: 1 object of type JSONParser left


¿Cómo puedo eliminar este JSONParser fuera de la función?


En este caso hay que crear un objeto temporal en la pila))
CSomeObj(<parámetros>).SomeMethod()
 
Vladimir Simakov:
En este caso hay que crear un objeto temporal en la pila))
CSomeObj(<parámetros>).SomeMethod()

este es mi primer ejemplo, creo JSONParser en el ámbito local allí, se eliminará cuando salga de la función

La cuestión es, básicamente, que tales cosas como un ejemplo #2 Sharp va a tragar, y aquí todavía tengo que pensar ... en general Sharp es más sucinto que Pros!!! - así que para un cholivar! )))

 
Igor Makanu:

este es mi primer ejemplo, creo JSONParser en el ámbito local allí, se eliminará cuando salga de la función

la cuestión es, en principio, que tales cosas como un ejemplo número 2 Sharpe va a tragar, y aquí todavía tiene que pensar ... en general Sharp es más sucinto que Pros!!! - así que para un cholivar! )))

Se crea un puntero a un objeto en un área local, pero el objeto en sí está en el montón y eso es lo que se filtra).
No es un Sharp, falta el recolector de basura)))
 
Vladimir Simakov:
Se crea un puntero a un objeto en un área local y el objeto mismo está en un montón y es el objeto el que se filtra).
No es sharpe, no hay recolector de basura))

¡Te dije que Sharpe manda! )))

Nn, en general, la primera opción la usaré y no molestaré al cerebro, ¡gracias por participar!

 

De todas formas no entiendo el comportamiento de los punteros en MQL, este código funciona sin problemas y borrará todos los objetos creados dinámicamente al final del script:

#include <JSON\json.mqh>
//+------------------------------------------------------------------+
JSONObject *getJSONObject(const string json)
{
   JSONParser *parser = new JSONParser();
   JSONValue *jv = parser.parse(json);
   delete parser;
   if (jv != NULL && jv.isObject()) return((JSONObject *)jv);
   Print(__FUNCSIG__ + "parser error, json = ", json);
   delete jv;
   return(NULL);
}
//+------------------------------------------------------------------+
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj != NULL) Print("m_period = ", jobj.getInt("m_period"));
   delete jobj;
}


¿Por qué funciona? He eliminado el objeto JSONParser *parser, por lo que debería obtener todos los punteros relacionados como NULL

 
Igor Makanu:

De todas formas no entiendo el comportamiento de los punteros en MQL, este código funciona sin problemas y borrará todos los objetos creados dinámicamente al final del script:


¿Por qué funciona? Acabo de eliminar el objeto JSONParser *parser, por lo que debería obtener todos los punteros relacionados como NULL

¿Por qué?

De nuevo, esto no es Sharp, no existen las "referencias enlazadas"... El objeto vive hasta que el programador lo mata personalmente, independientemente de las referencias.

 
Maxim Kuznetsov:

¿por qué iba a hacer eso?

de nuevo esto no es sharpe, no existen las "referencias enlazadas"... El objeto vive hasta que el programador lo mata personalmente, independientemente de las referencias.

Pues esa es la cuestión, tenemos una variante del código que funciona, pero el comportamiento de los punteros no me queda claro

En teoría, la variante 2 del primer mensaje debería funcionar

 
Es divertidísimo para los usuarios que se enzarzan en discusiones sobre el "alto" cuando en la práctica no saben juntar 1+1.
Me pregunto si el efecto Dunning-Krueger pica en alguna parte.
 

qué descarado soy aquí...

tú conseguiste un descuento por conocimiento, yo no conseguí ningún descuento) aunque todos son caros

Razón de la queja: