OLP. Problemi di applicazione - pagina 6

 
Interesting:

Anche assumendo che void Del(C_A *p) nell'antenato sia sufficiente per cancellare il puntatore di qualsiasi discendente, non vedo il motivo di usare

Beh, questa è un'altra questione :) - la questione della convenienza. Quello che mi interessa è la questione della correttezza/letteratura di un tale approccio.
 
Yedelkin:
Questa è un'altra questione :) - la questione della convenienza. Mi interessa la questione della correttezza/letteratura di tale approccio.

Tutte le opzioni sembrano essere buone, a patto che il puntatore sia rimosso correttamente.

E sembra essere stato rimosso, anche le perdite di memoria hanno smesso di apparire (non so perché sia apparso l'ultima volta)...

 
Interesting:

Tutte le opzioni sembrano essere buone finché il puntatore viene cancellato correttamente.

E sembra essere stato rimosso, anche le perdite di memoria smettono di apparire (chissà perché è venuto fuori l'ultima volta)...

Sembra strano dall'esterno - l'oggetto si blocca da solo.
 
Yedelkin:
Sembra figo dall'esterno - l'oggetto si schianta da solo.

Non è bello - quando te ne vai, "uccidi" tutti...

Questo codice è un po' più fresco (blocca tutto nell'array).

Ma la parte più bella è quando l'array è costruito in una classe figlia...

//----------------------------------------------------------------------------//
//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]));
  }
//----------------------------------------------------------------------------//
 

Domanda sul polimorfismo.

C'è un esempio di questo nella documentazione:

CShape[10] shapes;                       // массив объектов CShape
//... здесь заполняем массив производными объектами
for  (int i=0; i<10;i++)  
  {
   //--- тип и площадь фигуры
   Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea());
  };


Non sono sicuro di cosa dovrebbe esserci

//... здесь заполняем массив производными объектами

Posso avere almeno 1 esempio?

E perché la dimensione di un array è specificata per un tipo di variabile e non per la variabile stessa?

Inoltre, sembrano esserci errori nella dichiarazione delle classi nello stesso capitolo della documentazione:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 
equivalent23:

E perché la dimensionalità dell'array è specificata dal tipo di variabile e non dalla variabile stessa?

È questo che intende?
CShape[10] shapes;                       // массив объектов CShape

Questo è un puro errore di battitura.

23:

Inoltre, sembrano esserci errori nella dichiarazione delle classi nello stesso capitolo della documentazione:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

Ti riferisci alle parentesi graffe dopo il nome della classe dichiarata?

 
equivalent23:

Domanda sul polimorfismo.

C'è un esempio di questo nella documentazione:

CShape[10] shapes;                       // массив объектов CShape
//... здесь заполняем массив производными объектами
for  (int i=0; i<10;i++)  
  {
   //--- тип и площадь фигуры
   Print("Объект типа "+shapes[i].GetType()+" имеет площадь "+ shapes[i].GetArea());
  };

Non sono sicuro di cosa dovrebbe esserci.

//... здесь заполняем массив производными объектами

Posso avere almeno 1 esempio?

Prima del vostro esempio dalla documentazione, c'è questa frase: "Ora possiamo dichiarare un array di tipo Shape e riempirlo con oggetti di classi derivate. Quindi l'array shapes[10] dovrebbe essere riempito con istanze di classi derivate da CShape. Giusto?

Ci sono due esempi di classi derivate nella stessa documentazione: CCircle e CSquare. Quindi ci resta da creare istanze di queste due classi, per esempio:

CCircle  objCircle;
CSquare  objSquare;

... e riempire i primi due elementi del nostro array shapes[10] con essi:

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

Sei d'accordo?

 
Yedelkin:

Prima del vostro esempio dalla documentazione, c'è questa frase: "Ora possiamo dichiarare un array di tipo Shape e riempirlo con oggetti di classi derivate". Pertanto, l'array shapes[10] dovrebbe essere riempito con istanze di classi derivate da CShape. Giusto?

Ci sono due esempi di classi derivate nella stessa documentazione: CCircle e CSquare. Quindi ci resta da creare istanze di queste due classi, per esempio:

... e riempire i primi due elementi del nostro array shapes[10] con essi:

Sei d'accordo?

Posso essere d'accordo, ma il compilatore genera un errore:

'shape' - la struttura ha oggetti e non può essere copiata test.mq5 36 3

 
equivalent23:

Potrei essere d'accordo, ma il compilatore genera un errore:

'shape' - la struttura ha oggetti e non può essere copiata test.mq5 36 3

Puoi darmi il codice completo?
 
Yedelkin:
Puoi citare il codice completo?

Certo:

//+------------------------------------------------------------------+
//|                                                         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);
  }
//+------------------------------------------------------------------+

 
 

Motivazione: