Fragen zu OOP in MQL5 - Seite 72

 

Ich habe einige Missverständnisse mit Zeigern in MQL5 - eine sehr "unspezifizierte Sache".

Ich bin auf ein Problem mit einem Testskript gestoßen (ich habe die Bibliothek beigefügt):

dieser Code löscht den Zeiger, alles ist in Ordnung.

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

Zuerst wollte ich es so schreiben:

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

Wenn ich das Skript ausführe, erhalte ich: 1 object of type JSONParser left


so, wie ich diese JSONParser außerhalb der Funktion zu entfernen?


Dateien:
Include.zip  12 kb
 
Igor Makanu:

Ich habe einige Missverständnisse mit Zeigern in MQL5 - eine sehr "unspezifizierte Sache".

Ich bin auf ein Problem mit einem Testskript gestoßen (ich habe die Bibliothek beigefügt):

dieser Code löscht den Zeiger, alles ist in Ordnung.

Zuerst wollte ich es so schreiben:

Wenn ich das Skript ausführe, erhalte ich: 1 object of type JSONParser left


so, wie ich diese JSONParser außerhalb der Funktion zu entfernen?


In diesem Fall muss ein temporäres Objekt auf dem Stack angelegt werden)))
CSomeObj(<Parameter>).SomeMethod()
 
Vladimir Simakov:
In diesem Fall müssen Sie ein temporäres Objekt auf dem Stapel erstellen)))
CSomeObj(<Parameter>).SomeMethod()

Dies ist mein erstes Beispiel, ich erstellen JSONParser im lokalen Bereich gibt, wird es entfernt, wenn ich die Funktion beenden

Die Frage ist, im Grunde, dass solche Dinge wie ein Beispiel #2 Sharp schlucken wird, und hier muss ich noch nachdenken... im Allgemeinen ist Sharp prägnanter als Pros!!! - also für einen Cholivar! )))

 
Igor Makanu:

Dies ist mein erstes Beispiel, ich erstellen JSONParser im lokalen Bereich gibt, wird es gelöscht, wenn ich die Funktion beenden

die Frage ist, im Prinzip, dass solche Dinge wie ein Beispiel Nummer 2 Sharpe schlucken wird, und hier müssen Sie noch zu denken ... im Allgemeinen ist Sharp prägnanter als Pros!!! - also für einen Cholivar! )))

Sie erstellen einen Zeiger auf ein Objekt in einem lokalen Bereich, aber das Objekt selbst befindet sich im Heap und das ist es, was durchsickert).
Es ist kein Sharp, es fehlt die Müllabfuhr)))
 
Vladimir Simakov:
Sie erstellen einen Zeiger auf ein Objekt in einem lokalen Bereich und das Objekt selbst befindet sich in einem Heap, und es ist das Objekt, das ausläuft).
Es ist nicht scharf, es gibt keine Müllabfuhr)))

Ich sagte doch, Sharpe ist der Beste! )))

Nn, im Allgemeinen, die erste Option, die ich verwenden und wird nicht stören das Gehirn, danke für die Teilnahme!

 

Ich verstehe das Verhalten von Zeigern in MQL sowieso nicht, dieser Code funktioniert ohne Probleme und löscht alle dynamisch erstellten Objekte am Ende des Skripts:

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


Warum funktioniert es? Ich habe das JSONParser *parser-Objekt gelöscht, so dass es alle zugehörigen Zeiger als NULL erhalten sollte

 
Igor Makanu:

Ich verstehe das Verhalten von Zeigern in MQL sowieso nicht, dieser Code funktioniert ohne Probleme und löscht alle dynamisch erstellten Objekte am Ende des Skripts:


Warum funktioniert es? Ich habe gerade JSONParser *parser Objekt gelöscht, so sollte es alle zugehörigen Zeiger als NULL erhalten

Warum?

Nochmals, dies ist nicht Sharp, es gibt keine "verlinkten Referenzen"... Das Objekt lebt so lange, bis der Programmierer es persönlich löscht, unabhängig von den Referenzen.

 
Maxim Kuznetsov:

warum sollte ich das tun?

Nochmal: Das ist nicht Sharpe, es gibt keine "verlinkten Referenzen"... Das Objekt lebt so lange, bis der Programmierer es persönlich löscht, unabhängig von den Referenzen.

Nun, das ist die Frage, wir haben eine funktionierende Variante des Codes, aber das Verhalten der Zeiger ist mir unklar

Theoretisch sollte die Variante 2 aus der ersten Meldung funktionieren

 
Es ist lustig für die Nutzer, die sich auf Diskussionen über "hoch" einlassen, obwohl sie in der Praxis nicht einmal 1+1 zusammenzählen können.
Ich frage mich, ob der Dunning-Krueger-Effekt irgendwo zu spüren ist?
 

wie frech ich hier bin...

Sie haben einen Wissensrabatt bekommen, ich nicht), obwohl sie alle teuer sind

Grund der Beschwerde: