![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Incluso asumiendo que void Del(C_A *p) en el ancestro es suficiente para borrar cualquier puntero descendiente, no veo el sentido de usar
Esa es otra cuestión :) - la cuestión de la conveniencia. Me interesa la cuestión de la corrección/analfabetismo de dicho enfoque.
Todas las opciones parecen ser buenas siempre y cuando el puntero se elimine correctamente.
Y parece que se ha eliminado, incluso han dejado de aparecer las fugas de memoria (no sé por qué aparecieron la última vez)...
Todas las opciones parecen ser buenas siempre y cuando el puntero se borre correctamente.
Y parece que se ha eliminado, incluso las fugas de memoria dejan de aparecer (quién sabe por qué apareció la última vez)...
Se ve bien desde el exterior - el objeto se estrellará por sí mismo.
No está bien - cuando te vas, "matas" a todos...
Este código es un poco más fresco (choca con todo lo que hay en el array).
Pero lo mejor es cuando el array se incorpora a una clase hija...
Pregunta sobre el polimorfismo.
Hay un ejemplo de esto en la documentación:
CShape[10] shapes; // массив объектов CShape
//... здесь заполняем массив производными объектами
for (int i=0; i<10;i++)
{
//--- тип и площадь фигуры
Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea());
};
No estoy seguro de lo que debería haber en el lugar
//... здесь заполняем массив производными объектами
¿Puedo tener al menos un ejemplo?
¿Y por qué se especifica el tamaño de un array para un tipo de variable y no para la propia variable?
Además, parece que hay errores en la declaración de clases en el mismo capítulo de la documentación:
class CShape{};
class CCircle{} : public CShape
class CSquare{} : public CShape
¿Y por qué la dimensionalidad de la matriz está especificada por el tipo de variable y no por la propia variable?
Esto es un puro error tipográfico.
Además, parece que hay errores en la declaración de las clases en el mismo capítulo de la documentación:
class CShape{};
class CCircle{} : public CShape
class CSquare{} : public CShape
¿Te refieres a los corchetes después del nombre de la clase declarada?
Pregunta sobre el polimorfismo.
Hay un ejemplo de esto en la documentación:
CShape[10] shapes; // массив объектов CShape
//... здесь заполняем массив производными объектами
for (int i=0; i<10;i++)
{
//--- тип и площадь фигуры
Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea());
};
No estoy muy seguro de lo que debería haber en el lugar.
//... здесь заполняем массив производными объектами
¿Puedo tener al menos un ejemplo?
Antes de su ejemplo de la documentación, hay esta frase: "Ahora podemos declarar un array de tipo Shape y llenarlo con objetos de clases derivadas. Por lo tanto, la matriz shapes[10] debe llenarse con instancias de clases derivadas de CShape. ¿Verdad?
En la misma documentación hay dos ejemplos de clases derivadas: CCircle y CSquare, por lo que nos queda crear instancias de estas dos clases, por ejemplo:
... y llenar los dos primeros elementos de nuestro array shapes[10] con ellos:
¿Está de acuerdo?
Antes de su ejemplo de la documentación, hay esta frase: "Ahora podemos declarar un array de tipo Shape y llenarlo con objetos de clases derivadas". Por lo tanto, el array shapes[10] debe llenarse con instancias de clases derivadas de CShape. ¿Verdad?
En la misma documentación hay dos ejemplos de clases derivadas: CCircle y CSquare, por lo que nos queda crear instancias de estas dos clases, por ejemplo:
... y llenar los dos primeros elementos de nuestro array shapes[10] con ellos:
¿Está de acuerdo?
Puede que esté de acuerdo, pero el compilador genera un error:
'shape' - la estructura tiene objetos y no se puede copiar test.mq5 36 3
Podría estar de acuerdo, pero el compilador genera un error:
'shape' - la estructura tiene objetos y no se puede copiar test.mq5 36 3
¿Puede citar el código completo?
Claro que sí:
//+------------------------------------------------------------------+
//| test.mq5 |
//| Ya |
//| Ya |
//+------------------------------------------------------------------+
#property copyright "Ya"
#property link "Ya"
#property version "1.00"
#property indicator_chart_window
//--- Базовый класс
class CShape
{
protected:
int m_type; // тип фигуры
int m_xpos; // X - координата точки привязки
int m_ypos; // Y - координата точки привязки
public:
void CShape(){m_type=0;}; // конструктор, тип равен нулю
int GetType(){return(m_type);};// возвращает тип фигуры
virtual
double GetArea(){return (0); }// возвращает площадь фигуры
};
//--- производный класс Круг
class CCircle: public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
double m_radius; // радиус круга
public:
void CCircle(){m_type=1; m_radius=10;}; // конструктор, тип равен 1
void SetRadius(double r){m_radius=r;};
double GetArea(){return (3.14*m_radius*m_radius);}// площадь круга
};
//--- производный класс Квадрат
class CSquare: public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
double m_square_side; // сторона квадрата
public:
void CSquare(){m_type=2;}; // конструктор, тип равен 2
void SetSide(double s){m_square_side=s;};
virtual double GetArea(){return (m_square_side*m_square_side);}//площадь квадрата
};
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
CShape shape[10]; // массив объектов CShape
//... здесь заполняем массив производными объектами
CCircle circle;
shape[1]=circle;
Print("Объект типа "+shape[1].GetType()+" имеет площадь "+ shape[1].GetArea());
//---
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+