Domande su OOP in MQL5 - pagina 72

 

Ho qualche incomprensione con i puntatori in MQL5 - una cosa molto "non specificata".

Mi sono imbattuto in un problema con uno script di prova (ho allegato la libreria):

questo codice cancellerà il puntatore, tutto è OK.

#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; 
}

All'inizio volevo scriverlo così:

#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; 
}

quando eseguo lo script, ottengo: 1 oggetto di tipo JSONParser rimasto


quindi come faccio a rimuovere questo JSONParser al di fuori della funzione?


File:
Include.zip  12 kb
 
Igor Makanu:

Ho qualche incomprensione con i puntatori in MQL5 - una cosa molto "non specificata".

Mi sono imbattuto in un problema con uno script di prova (ho allegato la libreria):

questo codice cancellerà il puntatore, tutto è OK.

All'inizio volevo scriverlo così:

quando eseguo lo script, ottengo: 1 oggetto di tipo JSONParser rimasto


quindi come faccio a rimuovere questo JSONParser al di fuori della funzione?


In questo caso deve essere creato un oggetto temporaneo sullo stack))
CSomeObj(<params>).SomeMethod()
 
Vladimir Simakov:
Dovete creare un oggetto temporaneo sullo stack in questo caso)))
CSomeObj(<params>).SomeMethod()

questo è il mio primo esempio, creo JSONParser nell'ambito locale, sarà rimosso quando esco dalla funzione

La questione è, fondamentalmente, che tali cose come un esempio #2 Sharp inghiottirà, e qui ho ancora bisogno di pensare... in generale Sharp è più succinto di Pros!!! - così per un cholivar! )))

 
Igor Makanu:

questo è il mio primo esempio, creo JSONParser nell'ambito locale, sarà cancellato quando esco dalla funzione

la questione è, in linea di principio, che tali cose come un esempio numero 2 Sharpe inghiottirà, e qui è ancora necessario pensare ... in generale Sharp è più succinto di Pros!!! - così per un cholivar! )))

Si crea un puntatore a un oggetto in un'area locale, ma l'oggetto stesso è nell'heap ed è questo che trapela).
Non è uno Sharp, manca il raccoglitore di rifiuti)))
 
Vladimir Simakov:
Si crea un puntatore a un oggetto in un'area locale e l'oggetto stesso è in un heap ed è l'oggetto che perde).
Non è sharpe, non c'è un raccoglitore di rifiuti)))

Te l'avevo detto che Sharpe regna! )))

Nn, in generale, la prima opzione userò e non disturberà il cervello, grazie per aver partecipato!

 

Non capisco comunque il comportamento dei puntatori in MQL, questo codice funziona senza problemi e cancellerà tutti gli oggetti creati dinamicamente alla fine dello 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;
}


Perché funziona? Ho cancellato l'oggetto JSONParser *parser, quindi dovrebbe ottenere tutti i puntatori relativi come NULL

 
Igor Makanu:

Non capisco comunque il comportamento dei puntatori in MQL, questo codice funziona senza problemi e cancellerà tutti gli oggetti creati dinamicamente alla fine dello script:


Perché funziona? Ho appena cancellato l'oggetto JSONParser *parser, quindi dovrebbe ottenere tutti i puntatori come NULL

Perché?

Di nuovo, questo non è Sharp, non esistono "riferimenti collegati"... L'oggetto vive finché il programmatore non lo uccide personalmente, indipendentemente dai riferimenti.

 
Maxim Kuznetsov:

perché dovrei farlo?

ancora una volta questo non è sharpe, non ci sono cose come "riferimenti collegati"... L'oggetto vive fino a quando il programmatore lo uccide personalmente, indipendentemente dai riferimenti.

Bene, questa è la domanda, abbiamo una variante funzionante del codice, ma il comportamento dei puntatori non mi è chiaro

In teoria, la variante 2 del primo messaggio dovrebbe funzionare

 
È esilarante per gli utenti che entrano in discussioni su "alto" quando in pratica non sanno mettere insieme 1+1.
Mi chiedo se l'effetto Dunning-Krueger stia pungendo da qualche parte?
 

come sono sfacciato qui...

Tu hai avuto uno sconto sulla conoscenza, io non ho avuto uno sconto) anche se sono tutti costosi