Amir Yacoby: Aquí te equivocas, whroeder1. No añadir virtual en la base te hará perder el polimorfismo - el método será llamado estáticamente y no dinámicamente en tiempo de ejecución.
Esta fue la advertencia que whroeder1 mencionó.
whroeder1:
No añadir el virtual es una mala práctica, pero no es necesario(excepto en el CObject.)
No añadir el virtual no cambia nada, todavía puede ser anulado en una clase derivada.
Además, esto es incorrecto - hay una palabra clave "final" en MQL5.
También hay una palabra clave final en MQL4, aunque la documentación no lo muestra (que yo sepa). Posiblemente se mencionó en una actualización de la construcción.
No está claro lo que significa excepto en CObject, pero de todos modos, los puntos 1-2 son engañosos: 1. No sólo es una mala práctica, sino que se requiere en cada base (no sólo en CObject) si se requiere polimorfismo. 2. Sí cambia las cosas - ver 1. 3. Final sí existe.
honest_knave: También hay una palabra clave final en MQL4, aunque la documentación no la muestra (que yo sepa). Posiblemente se mencionó en una actualización de la construcción.
Estoy trabajando en una clase exactamente igual a la de este post, pero mi variable "score" es un método. ¿Cómo obtener su valor?
Este es el código del principio del post:
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+class PriceScore : public CObject
{
protected:
int price;
int score;
public:
PriceScore(void){}
PriceScore(int p, int s):price(p),score(s){}
~PriceScore(void){}
int Compare(const CObject *node,constint mode=0);
void Price(constint p){price = p;}
int Price() const {return price;}
void Score(constint s){score = s;}
int Score() const {return score;}
};
int PriceScore::Compare(const CObject *node,constint mode=0) //Can't call this override from CList
{
PriceScore *pc = (PriceScore*)node;
Print(__FUNCTION__,":Compare called. Incoming: ",pc.Score()," This: ", score); //Doesn't log because this isn't called from CObject'if(pc.Score()< score)return1;
elseif(pc.Score()> score) return -1;
elsereturn0;
}
Esto es lo que estoy tratando de hacer:
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+class PriceScore : public CObject
{
protected:
int price;
int score;
public:
PriceScore(void){}
PriceScore(int p, int s):price(p),score(s){}
~PriceScore(void){}
virtualint Compare(const CObject *node,constint mode=0) override const;
void setPrice(constint p){price = p;}
//this is a simple function to get the close price of todaydouble getPrice()
{
double arrayPrice[1];
CopyClose(mySymbol, myTimeFrame, today, 1, arrayPrice);
return arrayPrice[0];
}
void Score(constint s){score = s;}
int Score() const {return score;}
};
int PriceScore::Compare(const CObject *node,constint mode=0) const
{
PriceScore *pc = (PriceScore*)node;
Print(__FUNCTION__,":Compare called. Incoming: ",pc.Score()," This: ", score);
if(pc.Score() < getPrice()) //here is the problem, how to use getPrice()???return1;
elseif(pc.Score() > getPrice()) //here is the problem, how to use getPrice()???return -1;
elsereturn0;
}
La pregunta es, ¿cómo usar getPrice() dentro del método Compare()?
He cambiado el método getPrice(), en lugar de usar CopyClose() estoy usando CopyBuffer(). Esto no cambia el objetivo principal.
Entonces, si utilizo la palabra clave "const" en el método getPrice(), me sale el error "'CopyBuffer' - no se puede aplicar ninguna de las sobrecargas a la llamada de la función". Creo que esto ocurre porque CopyBuffer no es un método const, y no es posible llamar a un método no const dentro de un método const.
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.
Además, esto es incorrecto - hay una palabra clave 'final' en MQL5.
{
//--- class body
};
class CBar : public CFoo
{
//--- class body
};
Esto no permitirá que CBar compile porque CFoo es final.
Aquí te equivocas, whroeder1.
No añadir virtual en la base te hará perder el polimorfismo - el método será llamado estáticamente y no dinámicamente en tiempo de ejecución.
Esta fue la advertencia que whroeder1 mencionó.
Además, esto es incorrecto - hay una palabra clave "final" en MQL5.
1. No sólo es una mala práctica, sino que se requiere en cada base (no sólo en CObject) si se requiere polimorfismo.
2. Sí cambia las cosas - ver 1.
3. Final sí existe.
También hay una palabra clave final en MQL4, aunque la documentación no la muestra (que yo sepa). Posiblemente se mencionó en una actualización de la construcción.
Correcto.
Fue la Build 1430 para MQL5. Probablemente alrededor del mismo tiempo para MQL4 con el compilador común.
Hola chicos,
Estoy trabajando en una clase exactamente igual a la de este post, pero mi variable "score" es un método. ¿Cómo obtener su valor?
Este es el código del principio del post:
Esto es lo que estoy tratando de hacer:
La pregunta es, ¿cómo usar getPrice() dentro del método Compare()?
GraciasHola chicos,
Estoy trabajando en una clase exactamente igual a la de este post, pero mi variable "score" es un método. ¿Cómo obtener su valor?
Este es el código del principio del post:
Esto es lo que estoy tratando de hacer:
La pregunta es, ¿cómo usar getPrice() dentro del método Compare()?
GraciasDeclarar el método getPrice() con la palabra clave const.
Declare su método getPrice() con la palabra clave const.
Hola @Alain Verleyen,
He cambiado el método getPrice(), en lugar de usar CopyClose() estoy usando CopyBuffer(). Esto no cambia el objetivo principal.
Entonces, si utilizo la palabra clave "const" en el método getPrice(), me sale el error "'CopyBuffer' - no se puede aplicar ninguna de las sobrecargas a la llamada de la función". Creo que esto ocurre porque CopyBuffer no es un método const, y no es posible llamar a un método no const dentro de un método const.