Preguntas sobre POO en MQL5 - página 74

 
Vladimir Simakov:

Aquí no hay punteros) Hay un manejador para la clase, y trabajar con él es similar a trabajar con un puntero, pero ahí termina el terreno común.

Mi mente inquisitiva y mis manos traviesas me mantuvieron ocupada durante dos días y dos noches

He intentado eliminar el objeto creado dinámicamente fuera del ámbito - en la función, método de tanteo, pero finalmente he conseguido la solución:

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

que lo borre, pero no lo puedo resolver así.... y no he encontrado ninguna firma de función similar para pasar los punteros


Aquí hay otra pregunta:

¿cómo puedo devolver un puntero a un objeto por referencia como resultado de una función?

Quiero hacer algo así:

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


es posible devolverCTest * sin problemas, pero como escribí ret_CTest() - da un error

 
Igor Makanu:

Dos días y dos noches mi mente inquisitiva y mis manos traviesas me mantuvieron ocupado

trató de eliminar el objeto creado dinámicamente fuera del ámbito - en la función, el método de las tripas, pero finalmente llegó a la solución:

que lo borre, pero no lo puedo resolver así.... y no he podido encontrar ninguna firma de función similar para pasar punteros en la ayuda o en el sat

¿Qué quieres decir con que está fuera de alcance? Lo pasaste a una función, así que es visible allí)

s.s.void deleteCTest(CTest* &t) sin ese & debería funcionar también, ¿no?

Para eliminarlo realmente fuera del ámbito en el que fue creado, y posiblemente de forma automática, es necesario ... shh... antes de que alguien escuche... Pattern Factory... leer más rápido y borrar...

 

Igor Makanu:


pero ¿cómo devolver un puntero a un objeto por referencia como resultado de una función?

puede devolverCTest * sin problemas, pero como escribí ret_CTest() - da un error
Si quieres kosher
CTest& Foo();
, todavía no, pero si es así:
CTest Foo();

Si una clase tiene un constructor de copia, entonces debe tener un constructor de copia.

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

s.w.void deleteCTest(CTest* &t) sin esto & debería funcionar también, o no?

compruébalo, aprenderás algo nuevo ;)

He escrito muchas veces, que los punteros MQL son una cosa muy instructiva :)))


Vladimir Simakov:
Si quieres kosher, todavía no, pero si:

Si quieres usar un puntero, la clase debe tener un constructor de copia.

De nuevo, necesito pensar

Tengo la sospecha de que GetPointer() puede hacer algunos trucos... pero no es un hecho.... Estos "saltos en el espacio y en el tiempo" -mediante punteros y desreferencias implícitas en MQL- ¡se me van de las manos! (((

 
Igor Makanu:

compruébalo, aprenderás mucho ;)

He escrito muchas veces que los punteros en MQL son algo muy instructivo ))))

Borra los punteros pero no puede asignar un nuevo valor a _test. Por cierto, MQL no tiene nada que ver)))

 
Igor Makanu:

compruébalo, aprenderás mucho ;)

Te he dicho una y otra vez que los punteros en MQL son muy instructivos ))))


De nuevo, necesito pensar

Tengo la sospecha de que GetPointer() puede hacer algunos trucos... pero no es un hecho.... Estos "saltos en el espacio y en el tiempo" -mediante punteros y desreferencias implícitas en MQL- ¡se me van de las manos! (((

Está bien aquí)))) Apaga el sharpe, no hay ni una pizca de él aquí))))

 
Igor Makanu:

compruébalo, aprenderás mucho ;)

Te he dicho una y otra vez que los punteros en MQL son muy instructivos ))))

Lo he comprobado. Borra bien sin &)

Lo probé en MT4 y MT5 y compare )

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:

Bien revisado. Se borra perfectamente sin &)

Lo probé en MT4 y MT5 y compare )

No es un ejemplo completo, me lo encontré hoy.

No funcionará sin & .

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:

Estoy bien aquí))) No estoy buscando puntas, pero estoy seguro de que funcionará sin &)).


No estoy buscando Sharp, todavía estoy tratando con MQL, puedo preguntar lo que no entiendo.

 
Igor Makanu:

no es un ejemplo completo, me lo encontré hoy.

no funcionará así sin &

Claro que sí. Estás pasando un puntero por valor, por lo que se creará una copia del puntero. Lo usarás para clavar el objeto, y crearás un nuevo objeto para el puntero que se creó en la función. Esto es c++, bienvenido))))
 
Igor Makanu:

no es un ejemplo completo, se encontró hoy

no funcionará sin &



En mi opinión, no tiene nada que ver con las referencias, sino sólo con el hecho de que el argumento de la función debe pasarse por puntero si se quiere que guarde el valor después de la ejecución de la función. Lo mismo ocurrirá con un manejador de archivo o de indicador, por ejemplo, que no son referencias.

Esto siempre ha sido el estándar en C++, aunque hace mucho tiempo que lo recuerdo vagamente.