OLP. Problèmes d'application - page 6

 
Interesting:

Même en supposant que void Del(C_A *p) dans l'ancêtre est suffisant pour effacer le pointeur de n'importe quel descendant, je ne vois pas l'utilité d'utiliser

Eh bien, c'est une autre question :) - la question de l'opportunité. Ce qui m'intéresse, c'est la question de la justesse/littérature d'une telle approche.
 
Yedelkin:
C'est une autre question :) - la question de l'opportunité. Je suis intéressé par la question de la justesse/littérature d'une telle approche.

Toutes les options semblent bonnes, tant que le pointeur est retiré correctement.

Et il semble avoir été supprimé, même les fuites de mémoire ont cessé d'apparaître (je ne sais pas pourquoi elles sont apparues la dernière fois)...

 
Interesting:

Toutes les options semblent bonnes tant que le pointeur est supprimé correctement.

Et il semble être supprimé, même les fuites de mémoire n'apparaissent plus (qui sait pourquoi il est apparu la dernière fois)...

Ça a l'air bizarre de l'extérieur - l'objet s'écrase tout seul.
 
Yedelkin:
Cela a l'air cool de l'extérieur - l'objet s'écrasera tout seul.

C'est pas cool - quand tu pars, tu "tues" tout le monde...

Ce code est un peu plus cool (il plante tout dans le tableau).

Mais la partie la plus cool est lorsque le tableau est intégré dans une classe enfant...

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

Question sur le polymorphisme.

Vous trouverez un exemple dans la documentation:

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


Pas tout à fait sûr de ce qui devrait être en place

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

Puis-je avoir au moins un exemple ?

Et pourquoi la taille d'un tableau est-elle spécifiée pour un type de variable et non pour la variable elle-même ?

En outre, il semble y avoir des erreurs dans la déclaration des classes dans le même chapitre de la documentation:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 
equivalent23:

Et pourquoi la dimensionnalité du tableau est-elle spécifiée par le type de variable et non par la variable elle-même ?

C'est ce que vous voulez dire ?
CShape[10] shapes;                       // массив объектов CShape

C'est une pure erreur de frappe.

23:

En outre, il semble y avoir des erreurs dans la déclaration des classes dans le même chapitre de la documentation:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

Faites-vous référence aux crochets après le nom de la classe déclarée ?

 
equivalent23:

Question sur le polymorphisme.

Vous trouverez un exemple dans la documentation:

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

Je ne suis pas tout à fait sûr de ce qui devrait être mis en place.

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

Puis-je avoir au moins un exemple ?

Avant votre exemple de la documentation, il y a cette phrase : "Maintenant nous pouvons déclarer un tableau de type Shape et le remplir avec des objets de classes dérivées. Le tableau shapes[10] doit donc être rempli d'instances de classes dérivées de CShape. N'est-ce pas ?

Il existe deux exemples de classes dérivées dans la même documentation : CCircle et CSquare. Il nous reste donc à créer des instances de ces deux classes, par exemple :

CCircle  objCircle;
CSquare  objSquare;

... et remplissons les deux premiers éléments de notre tableau shapes[10] avec eux :

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

Êtes-vous d'accord ?

 
Yedelkin:

Avant votre exemple de la documentation, il y a cette phrase : "Maintenant nous pouvons déclarer un tableau de type Forme et le remplir avec des objets de classes dérivées". Par conséquent, le tableau shapes[10] doit être rempli d'instances de classes dérivées de CShape. N'est-ce pas ?

Il existe deux exemples de classes dérivées dans la même documentation : CCircle et CSquare. Il nous reste donc à créer des instances de ces deux classes, par exemple :

... et remplissons les deux premiers éléments de notre tableau shapes[10] avec eux :

Êtes-vous d'accord ?

Je suis peut-être d'accord, mais le compilateur génère une erreur :

shape" - la structure a des objets et ne peut pas être copiée test.mq5 36 3

 
equivalent23:

Je pourrais être d'accord, mais le compilateur génère une erreur :

shape" - la structure a des objets et ne peut pas être copiée test.mq5 36 3

Pouvez-vous me donner le code complet ?
 
Yedelkin:
Pouvez-vous citer le code complet ?

Bien sûr :

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

 
 

Raison: