OLP. Problemas de aplicación - página 6

 
Interesting:

Incluso asumiendo que void Del(C_A *p) en el ancestro es suficiente para borrar cualquier puntero descendiente, no veo el sentido de usar

Bueno, esta es otra cuestión :) - la cuestión de la conveniencia. Lo que me interesa es la cuestión de la corrección/literatura de dicho enfoque.
 
Yedelkin:
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)...

 
Interesting:

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 estrella a sí mismo.
 
Yedelkin:
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...

//----------------------------------------------------------------------------//
//Work variables
C_A *ArrPointer[4];

int Result = 0; //Returned importance
//----------------------------------------------------------------------------//

ArrPointer[0] = new C_A;
ArrPointer[1] = new C_B;
ArrPointer[2] = new C_C;
ArrPointer[3] = new C_D;

  for(int i=0;i<4;i++)
  {
  ArrPointer[i].Free(ArrPointer[i]);
  Print("CheckPointer №",i+1," - ",CheckPointer(ArrPointer[i]));
  }
//----------------------------------------------------------------------------//
 

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

 
equivalent23:

¿Y por qué la dimensionalidad de la matriz está especificada por el tipo de variable y no por la propia variable?

¿Es eso lo que quieres decir?
CShape[10] shapes;                       // массив объектов CShape

Esto es un puro error tipográfico.

23:

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?

 
equivalent23:

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:

CCircle  objCircle;
CSquare  objSquare;

... y llenar los dos primeros elementos de nuestro array shapes[10] con ellos:

shapes[0]=objCircle;
shapes[1]=objSquare;

¿Está de acuerdo?

 
Yedelkin:

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

 
equivalent23:

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 darme el código completo?
 
Yedelkin:
¿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);
  }
//+------------------------------------------------------------------+

 
 

Razón de la queja: