Perguntas sobre OOP em MQL5 - página 72

 

Tenho alguns mal-entendidos com as indicações na MQL5 - uma coisa muito "não especificada".

Tive um problema com um roteiro de teste (anexei a biblioteca):

este código irá apagar o ponteiro, tudo está bem.

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

Eu queria escrevê-lo desta maneira no início:

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

ao executar o roteiro, recebo: 1 objeto do tipo JSONParser à esquerda


então como remover este JSONParser fora da função ?


Arquivos anexados:
Include.zip  12 kb
 
Igor Makanu:

Tenho alguns mal-entendidos com as indicações na MQL5 - uma coisa muito "não especificada".

Tive um problema com um roteiro de teste (anexei a biblioteca):

este código irá apagar o ponteiro, tudo está bem.

Eu queria escrevê-lo desta maneira no início:

ao executar o roteiro, recebo: 1 objeto do tipo JSONParser à esquerda


então como remover este JSONParser fora da função ?


Um objeto temporário deve ser criado na pilha, neste caso))))
CSomeObj(<params>).SomeMethod()
 
Vladimir Simakov:
Você tem que criar um objeto temporário na pilha, neste caso))
CSomeObj(<params>).SomeMethod()

este é meu primeiro exemplo, eu crio o JSONParser em âmbito local lá, ele será removido quando eu sair da função

A questão é, basicamente, que coisas como um exemplo nº 2 Sharp engolirão, e aqui eu ainda preciso pensar... em geral Sharp é mais sucinta que Pros!! - então para um cholivar! )))

 
Igor Makanu:

este é meu primeiro exemplo, eu crio o JSONParser em âmbito local lá, ele será apagado quando eu sair da função

a questão é, em princípio, que coisas como um exemplo número 2 Sharpe irão engolir, e aqui você ainda precisa pensar ... em geral Sharp é mais sucinta que Pros!! - então para um cholivar! )))

Você cria um ponteiro para um objeto em uma área local, mas o objeto em si está na pilha e isso é o que vaza).
Não é um Sharp, o coletor de lixo está faltando))))
 
Vladimir Simakov:
Você cria um ponteiro para um objeto em uma área local e o próprio objeto está em uma pilha e é o objeto que vaza).
Não é afiado, não há coletor de lixo))))

Eu lhe disse regras Sharpe! )))

Nn, em geral, a primeira opção que usarei e não incomodará o cérebro, obrigado por participar!

 

Não entendo o comportamento dos ponteiros na MQL de qualquer forma, este código funciona sem problemas e apagará todos os objetos criados dinamicamente no final do 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 que funciona? eu apaguei o objeto*parser do JSONParser, então ele deve receber todas as indicações relacionadas como NULL

 
Igor Makanu:

Não entendo o comportamento dos ponteiros na MQL de qualquer forma, este código funciona sem problemas e apagará todos os objetos criados dinamicamente no final do script:


por que funciona? acabei de apagar o objeto JSONParser *parser, então ele deve receber todas as indicações como NULL

por que ?

Mais uma vez, isto não é Sharp, não existem "referências vinculadas"... O objeto vive até que o programador o mate pessoalmente, independentemente de referências.

 
Maxim Kuznetsov:

por que eu faria isso?

mais uma vez isto não é afiado, não há "referências vinculadas"... O objeto vive até que o programador o mate pessoalmente, independentemente de referências.

Bem, essa é a questão, temos uma variante viável do código, mas o comportamento dos ponteiros não é claro para mim.

Em teoria, a variante 2 da primeira mensagem deve funcionar

 
É hilariante para os usuários que entram em discussões sobre "alto" quando na prática não conseguem colocar 1+1 juntos.
Será que o efeito Dunning-Krueger está pungindo em algum lugar?
 

como sou atrevido aqui...

você conseguiu um desconto de conhecimento, eu não consegui um desconto) apesar de serem todos caros