¡Ya lo tengo! Bueno, ¡me has dado muchos ánimos! Ahora voy a duplicar el placer de estampar métodos anidados :)
Urain, ¡gracias por el ejemplo! Mientras no tengas experiencia en programación, a veces es difícil adivinar por ti mismo para comprobar y escribir un código correcto para ello. Y aquí todo es claro y comprensible.
¿Es un error (o una característica del compilador) que el compilador pasó por alto?
Por supuesto, podemos asumir que el descendiente pasó la clase que necesitamos, pero las estructuras y la funcionalidad de las dos clases podrían ser muy diferentes. ¿Qué ocurre entonces?
Y al utilizar el código inicial así, se produce una fuga de memoria en absoluto, aunque se han pasado todas las comprobaciones del compilador (y ni siquiera ha mencionado ningún posible problema)
Este es el resultado (entiendo que el objeto puntero no se borra correctamente por la fuga de memoria):
2011.04.0919:21:07 Forum (EURUSD,D1) 16 bytes of leaked memory2011.04.0919:21:07 Forum (EURUSD,D1) 1 object of type C_B left
2011.04.0919:21:07 Forum (EURUSD,D1) 1 undeleted objects left
Si lo entiendo bien, no me gustan los punteros (y no los uso a menudo, especialmente en MQL5), entonces el descendiente debería ser así
Mira. He declarado el método void Del(C_A *p) con el modificador public en la clase padre. Por lo tanto, la clase hija ha heredado completamente este método. Así no necesito volver a declarar el mismo método en la clase hija. En cuanto a
C_A *pointer=new C_B;
Esta idea la saqué del tetris, y me funciona muy bien. Por supuesto, no sería correcto utilizar esta línea sin más, pero es muy adecuada para fines similares a los que se resuelven en el tetris.
Se ha modificado ligeramente el código del script:
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+class C_A
{
public:
C_A(){ Print("Запущен класс С_А"); };
~C_A(){Print("Закрыт класс С_А");};
void Del(C_A *p)
{
if(CheckPointer(p)==POINTER_DYNAMIC)
{
delete p;
Print("Удалён объект p");
}
}
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+class C_B : public C_A
{
public:
C_B(){ Print("Запущен класс С_В"); };
~C_B(){Print("Закрыт класс С_В");};
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
C_A *pointer=new C_B;
if(pointer!=NULL) Print("указатель pointer проинициализирован");
pointer.Del(pointer);
}
Salidas
EL 0 ttttttttttttt (EURUSD,M1) 15:08:27 Запущен класс С_А
MS 0 ttttttttttttt (EURUSD,M1) 15:08:27 Запущен класс С_В
DJ 0 ttttttttttttt (EURUSD,M1) 15:08:27 указатель pointer проинициализирован
IH 0 ttttttttttttt (EURUSD,M1) 15:08:27 Закрыт класс С_В
CG 0 ttttttttttttt (EURUSD,M1) 15:08:27 Закрыт класс С_А
RO 0 ttttttttttttt (EURUSD,M1) 15:08:27 Удалён объект p
Yedelkin: Mira. Declaré el método void Del(C_A *p) con el modificador public en la clase padre. Así que la clase hija ha heredado completamente este método. Así no necesito volver a declarar el mismo método en la clase hija. En cuanto a esta idea, la saqué del tetris y me funcionó muy bien. Por supuesto, no sería correcto utilizar esta cadena sin más, pero es muy adecuada para fines similares a los que se resuelven en el tetris.
Incluso asumiendo que void Del(C_A *p) en el ancestro es suficiente para borrar cualquier puntero descendiente, no veo el sentido de usar
C_A *pointer=new C_B;
PS
El único lugar donde puedo imaginar la necesidad de tal enfoque es la creación de una matriz de objetos diversos que son descendientes de la misma clase (alternativamente, pasando un parámetro del tipo de clase "base" en una función o procedimiento).
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
De alguna manera, la cuestión de si la multipropiedad afecta o no a la velocidad de procesamiento del código por parte del procesador(2011.04.04 21:58) queda completamente desatendida.
Si la pregunta parece incorrecta, tonta, etc. - entonces escribe así.
De alguna manera, la cuestión de si la multipropiedad afecta o no a la velocidad de procesamiento de código del procesador(2011.04.04 21:58) queda completamente desatendida.
Si la pregunta parece incorrecta, tonta, etc. - sólo escríbelo así.
La pregunta es perfectamente lógica, la respuesta es no, no lo hace.
¡Ya lo tengo! Bueno, ¡me has dado muchos ánimos! Ahora voy a duplicar el placer de estampar métodos anidados :)
Urain, ¡gracias por el ejemplo! Mientras no tengas experiencia en programación, a veces es difícil adivinar por ti mismo para comprobar y escribir un código correcto para ello. Y aquí todo es claro y comprensible.
Pregunta. ¿Puede una instancia de una clase hija borrarse a sí misma? En otras palabras, ¿funcionará esta construcción?
El compilador no se queja de esta construcción.Pregunta. ¿Puede una instancia de una clase hija borrarse a sí misma? En otras palabras, ¿funcionará esta construcción?
El compilador no se queja de esta construcción.Si lo he entendido bien, no me gustan los punteros (y no los uso a menudo, sobre todo en MQL5), el hijo debería ser así
Por lo tanto, la aplicación tendría el siguiente aspecto
PS
¿Es un error (o una característica del compilador) que el compilador pasó por alto?
Por supuesto, podemos asumir que el descendiente pasó la clase que necesitamos, pero las estructuras y la funcionalidad de las dos clases podrían ser muy diferentes. ¿Qué ocurre entonces?
C_A *pointer=new C_B;Y al utilizar el código inicial así, se produce una fuga de memoria en absoluto, aunque se han pasado todas las comprobaciones del compilador (y ni siquiera ha mencionado ningún posible problema)
Este es el resultado (entiendo que el objeto puntero no se borra correctamente por la fuga de memoria):
Si lo entiendo bien, no me gustan los punteros (y no los uso a menudo, especialmente en MQL5), entonces el descendiente debería ser así
C_A *pointer=new C_B;Esta idea la saqué del tetris, y me funciona muy bien. Por supuesto, no sería correcto utilizar esta línea sin más, pero es muy adecuada para fines similares a los que se resuelven en el tetris.De alguna manera, la cuestión de si la multipropiedad afecta o no a la velocidad de procesamiento de código del procesador(2011.04.04 21:58) queda completamente desatendida.
Si la pregunta parece incorrecta, tonta, etc. - sólo escríbelo.
La respuesta a la lógica: cuanto más simples y lógicas sean las primitivas, más eficiente será el optimizador.
Lo principal es no exagerar :)
Se ha modificado ligeramente el código del script:
Salidas
Mira. Declaré el método void Del(C_A *p) con el modificador public en la clase padre. Así que la clase hija ha heredado completamente este método. Así no necesito volver a declarar el mismo método en la clase hija. En cuanto a esta idea, la saqué del tetris y me funcionó muy bien. Por supuesto, no sería correcto utilizar esta cadena sin más, pero es muy adecuada para fines similares a los que se resuelven en el tetris.
Incluso asumiendo que void Del(C_A *p) en el ancestro es suficiente para borrar cualquier puntero descendiente, no veo el sentido de usar
C_A *pointer=new C_B;PS
El único lugar donde puedo imaginar la necesidad de tal enfoque es la creación de una matriz de objetos diversos que son descendientes de la misma clase (alternativamente, pasando un parámetro del tipo de clase "base" en una función o procedimiento).