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?
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:
CCircle objCircle;
CSquare objSquare;
... y llenar los dos primeros elementos de nuestro array shapes[10] con ellos:
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
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
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.
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);
}
//+------------------------------------------------------------------+