OLP. Questões de aplicação - página 6

 
Interesting:

Mesmo assumindo que o Del(C_A *p) vazio no antepassado é suficiente para apagar qualquer ponteiro descendente, não vejo a utilidade de usar

Bem, esta é outra questão :) - a questão da oportunidade. O que me interessa é a questão da correcção/alfabetização de uma tal abordagem.
 
Yedelkin:
Essa é outra questão :) - a questão da oportunidade. Estou interessado na questão da correcção/iliteracia de tal abordagem.

Todas as opções parecem ser boas desde que o ponteiro seja removido correctamente.

E parece ter sido removida, até as fugas de memória deixaram de aparecer (não sei porque apareceu da última vez)...

 
Interesting:

Todas as opções parecem ser boas desde que o ponteiro seja apagado correctamente.

E parece ter sido removida, mesmo as fugas de memória deixam de aparecer (quem sabe porquê da última vez que surgiu)...

Parece fresco do exterior - o objecto cai sozinho.
 
Yedelkin:
Tem um aspecto fresco do exterior - o objecto vai-se colidir sozinho.

Não é fixe - quando se sai, "mata-se" toda a gente...

Este código é um pouco mais fixe (bloqueia tudo na matriz).

Mas a parte mais fixe é quando o conjunto é incorporado numa classe infantil.

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

A questão do polimorfismo.

Há um exemplo disto na documentação:

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


Não tenho bem a certeza do que deve estar no lugar

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

Posso ter pelo menos 1 exemplo?

E porque é que o tamanho de uma matriz é especificado para um tipo de variável e não para a variável em si?

Além disso, parece haver erros na declaração de classes no mesmo capítulo da documentação:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 
equivalent23:

E porque é que a dimensionalidade da matriz é especificada pelo tipo de variável e não pela variável em si?

É a isso que se refere?
CShape[10] shapes;                       // массив объектов CShape

Isto é uma gralha pura.

23:

Além disso, parece haver erros na declaração de aulas no mesmo capítulo de documentação:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

Está a referir-se a parênteses curvos após o nome da classe que está a ser declarada?

 
equivalent23:

Pergunta sobre o polimorfismo.

Há um exemplo disto na documentação:

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

Não tenho bem a certeza do que deveria estar no lugar.

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

Posso ter pelo menos 1 exemplo?

Antes do seu exemplo da documentação, há esta frase: "Agora podemos declarar um conjunto de tipos de Forma e preenchê-lo com objectos de classes derivadas. Assim, a matriz de formas[10] deve ser preenchida com instâncias de classes derivadas de CShape. Certo?

Há dois exemplos de classes derivadas na mesma documentação: CCircle e CSquare. Resta-nos, portanto, criar instâncias destas duas classes, por exemplo:

CCircle  objCircle;
CSquare  objSquare;

... e preencher os dois primeiros elementos das nossas formas de matriz[10] com eles:

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

De acordo?

 
Yedelkin:

Antes do seu exemplo da documentação, há esta frase: "Agora podemos declarar um conjunto de tipos de Forma e preenchê-lo com objectos de classes derivadas". Por conseguinte, as formas de matriz[10] devem ser preenchidas com instâncias de classes derivadas de CShape. Certo?

Há dois exemplos de classes derivadas na mesma documentação: CCircle e CSquare. Resta-nos, portanto, criar instâncias destas duas classes, por exemplo:

... e preencher os dois primeiros elementos das nossas formas de matriz[10] com eles:

Concorda?

Posso concordar, mas o compilador gera um erro:

'forma' - a estrutura tem objectos e não pode ser copiada teste.mq5 36 3

 
equivalent23:

Eu posso concordar, mas o compilador gera um erro:

'forma' - a estrutura tem objectos e não pode ser copiada teste.mq5 36 3

Pode dar-me o código completo?
 
Yedelkin:
Pode citar o código completo?

Claro:

//+------------------------------------------------------------------+
//|                                                         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ão: