Perguntas sobre OOP em MQL5 - página 74

 
Vladimir Simakov:

Não há indicadores aqui) Há um cabo para a classe, e trabalhar com ele é semelhante a trabalhar com um ponteiro, mas é aí que termina o terreno comum.

Minha mente inquisitiva e minhas mãos marotas me assombram há dois dias e duas noites

tentei remover o objeto criado dinamicamente fora do escopo - na função, método de apalpação, mas finalmente consegui a solução:

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

que o apaga, mas não consigo descobrir assim.... e não encontrei nenhuma assinatura de função similar para passar as indicações


Aqui está outra pergunta:

como posso devolver um ponteiro a um objeto por referência, como resultado de uma função?

Eu quero fazer algo assim:

CTest ret_CTest()
{
   CTest *result = new CTest;
   return(result);
}


é possível retornar oCTest * sem problemas, mas como escrevi ret_CTest() - ele dá um erro

 
Igor Makanu:

Dois dias e duas noites minha mente inquisitiva e minhas mãos marotas me mantiveram ocupado

tentou remover objeto criado dinamicamente fora do escopo - na função, método de sensação intestinal, mas finalmente chegou à solução:

que o apaga, mas não consigo descobrir assim.... e não consegui encontrar nenhuma assinatura de função similar para passar ponteiros em ajuda ou sentar

O que você quer dizer com está fora do escopo? Você o passou para uma função, então é visível lá)

s.s.void deleteCTest(CTest* &t) sem isso & deve funcionar também, certo?

Para realmente removê-lo fora do escopo onde foi criado, e possivelmente automaticamente, você precisa ... shh... antes que alguém ouça... Fábrica de Padrões... ler mais rápido e excluir...

 

Igor Makanu:


mas como devolver um ponteiro a um objeto por referência como resultado de uma função?

você pode devolver oCTest * sem problemas, mas como escrevi ret_CTest() - ele dá um erro
Se você quiser kosher
CTest& Foo();
, ainda não, mas se quiser:
CTest Foo();

Se uma classe tem um construtor de cópias, então ela deve ter um construtor de cópias.

CTest(CTest &other)...
 
Aleksey Mavrin:

s.w.void deleteCTest(CTest* &t) sem este & deve funcionar também, ou não?

veja, você vai aprender algo novo ;)

Já escrevi muitas vezes, que os indicadores MQL são uma coisa muito instrutiva :))))


Vladimir Simakov:
Se você quiser kosher, ainda não, mas se quiser:

Se você quiser usar um ponteiro, a classe deve ter um construtor de cópias.

Mais uma vez, vamos pensar sobre isso

Tenho uma suspeita de que GetPointer() possa fazer alguns truques... mas não é um fato.... Estes "saltos através do espaço e do tempo" - via ponteiro e desreferenciamento implícito no MQL - estão fora de mim! (((

 
Igor Makanu:

confira, você vai aprender muito ;)

Já escrevi muitas vezes que as indicações na MQL são muito instrutivas ))))

Ele apaga apontadores, mas não pode atribuir um novo valor ao _teste. A propósito, a MQL não tem nada a ver com isso))))

 
Igor Makanu:

confira, você vai aprender muito ;)

Já lhe disse várias vezes que as indicações na MQL são muito instrutivas ))))


Mais uma vez, eu preciso pensar

Tenho uma suspeita de que GetPointer() possa fazer alguns truques... mas não é um fato.... Estes "saltos através do espaço e do tempo" - via ponteiro e desreferenciamento implícito no MQL - estão fora de mim! (((

Está tudo bem aqui)))) Apenas desligue o sharpe, não há nem uma dica disso aqui))))

 
Igor Makanu:

confira, você vai aprender muito ;)

Já lhe disse várias vezes que as indicações na MQL são muito instrutivas ))))

Eu o verifiquei. Ele apaga bem sem &)

Eu experimentei no MT4 e MT5 e comparei )

class CTest
{
public:
   CTest() { Print(__FUNCTION__); }
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin:

Bem verificado. Ele apaga perfeitamente sem &)

Eu experimentei no MT4 e MT5 e comparei )

Não é um exemplo completo, hoje me deparei com ele.

Não funcionará sem & .

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* & t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

Vladimir Simakov:

Eu estou bem aqui)))) Não estou procurando afiados, mas tenho certeza de que funcionará sem &))).


Não estou procurando a Sharp, ainda estou lidando com a MQL, posso perguntar o que não entendo.

 
Igor Makanu:

não um exemplo completo, me deparei com ele hoje.

não funcionará dessa forma sem &

Claro que sim. Você está passando um ponteiro por valor, portanto, uma cópia do ponteiro será criada. Você vai usá-lo para pregar o objeto e criar um novo objeto para o ponteiro que foi criado na função. Este é o c++, bem-vindo))))
 
Igor Makanu:

não um exemplo completo, me deparei com ele hoje.

não vai funcionar sem &



Na minha opinião, não tem nada a ver com referências, mas apenas com o fato de que o argumento da função deve ser passado pelo ponteiro se você quiser que ele salve o valor depois que a função estiver em execução. O mesmo acontecerá com um arquivo ou um cabo indicador, que não são referências, por exemplo.

Este tem sido sempre o padrão em C++, embora já tenha passado muito tempo desde que me lembro vagamente.

Razão: