PLO. Fragen zur Anwendung - Seite 6

 
Interesting:

Selbst wenn man davon ausgeht, dass void Del(C_A *p) im Vorgänger ausreicht, um den Zeiger eines beliebigen Nachfolgers zu löschen, sehe ich keinen Sinn darin, mit

Nun, das ist eine andere Frage :) - die Frage der Zweckmäßigkeit. Was mich interessiert, ist die Frage nach der Korrektheit eines solchen Ansatzes.
 
Yedelkin:
Das ist eine andere Frage :) - die Frage der Zweckmäßigkeit. Ich bin an der Frage interessiert, ob ein solcher Ansatz richtig ist oder nicht.

Alle Optionen scheinen gut zu sein, solange der Zeiger richtig entfernt wird.

Und es scheint beseitigt zu sein, sogar Speicherlecks treten nicht mehr auf (ich weiß nicht, warum es beim letzten Mal auftrat)...

 
Interesting:

Alle Optionen scheinen gut zu sein, solange der Zeiger korrekt gelöscht wird.

Und es scheint beseitigt zu sein, sogar Speicherlecks treten nicht mehr auf (wer weiß, warum es beim letzten Mal auftrat)...

Von außen sieht es komisch aus - das Objekt stürzt von selbst ab.
 
Yedelkin:
Von außen sieht es cool aus - das Objekt stürzt von selbst ab.

Das ist nicht cool - wenn du gehst, "tötest" du alle...

Dieser Code ist ein bisschen cooler (lässt alles im Array abstürzen).

Aber am coolsten ist es, wenn das Array in eine Child-Klasse eingebaut wird...

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

Frage des Polymorphismus.

Ein Beispiel dafür finden Sie in der Dokumentation:

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


Nicht ganz sicher, was vorhanden sein sollte

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

Kann ich mindestens 1 Beispiel haben?

Und warum wird die Größe eines Arrays für einen Variablentyp angegeben und nicht für die Variable selbst?

Darüber hinaus scheint es Fehler bei der Deklaration von Klassen im selben Kapitel der Dokumentation zu geben:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 
equivalent23:

Und warum wird die Dimensionalität des Arrays durch den Variablentyp und nicht durch die Variable selbst festgelegt?

Ist es das, was Sie meinen?
CShape[10] shapes;                       // массив объектов CShape

Dies ist ein reiner Tippfehler.

23:

Außerdem scheint es Fehler bei der Deklaration von Klassen im gleichen Dokumentationskapitel zu geben:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

Beziehen Sie sich auf geschweifte Klammern nach dem Namen der deklarierten Klasse?

 
equivalent23:

Frage zum Polymorphismus.

Ein Beispiel dafür finden Sie in der Dokumentation:

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

Ich bin mir nicht ganz sicher, was es sein sollte.

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

Kann ich mindestens 1 Beispiel haben?

Vor Ihrem Beispiel aus der Dokumentation steht dieser Satz: "Jetzt können wir ein Array vom Typ Shape deklarieren und es mit Objekten abgeleiteter Klassen füllen. Daher sollte das Array shapes[10] mit Instanzen von Klassen gefüllt werden, die von CShape abgeleitet sind. Oder?

In der gleichen Dokumentation finden sich zwei Beispiele für abgeleitete Klassen: CCircle und CSquare. Es bleibt uns also nichts anderes übrig, als Instanzen dieser beiden Klassen zu erstellen:

CCircle  objCircle;
CSquare  objSquare;

... und füllen die ersten beiden Elemente unseres Arrays shapes[10] mit ihnen:

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

Sind Sie damit einverstanden?

 
Yedelkin:

Vor Ihrem Beispiel aus der Dokumentation steht dieser Satz: "Jetzt können wir ein Array vom Typ Shape deklarieren und es mit Objekten abgeleiteter Klassen füllen". Daher sollte das Array shapes[10] mit Instanzen von Klassen gefüllt werden, die von CShape abgeleitet sind. Richtig?

Es gibt zwei Beispiele für abgeleitete Klassen in der gleichen Dokumentation: CCircle und CSquare. Es bleibt uns also übrig, Instanzen dieser beiden Klassen zu erstellen, zum Beispiel:

... und füllen die ersten beiden Elemente unseres Arrays shapes[10] mit ihnen:

Sind Sie damit einverstanden?

Ich mag zustimmen, aber der Compiler erzeugt einen Fehler:

'shape' - Struktur hat Objekte und kann nicht kopiert werden test.mq5 36 3

 
equivalent23:

Ich könnte zustimmen, aber der Compiler erzeugt einen Fehler:

'shape' - Struktur hat Objekte und kann nicht kopiert werden test.mq5 36 3

Können Sie mir den vollständigen Code geben?
 
Yedelkin:
Können Sie den vollständigen Code angeben?

Ja, sicher:

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