OOP. Başvuru soruları - sayfa 6

 
Interesting :

Atadaki void Del(C_A *p) öğesinin herhangi bir çocuğun işaretçisini silmek için yeterli olacağını varsaysak bile, kullanmak için bir neden göremiyorum.

Peki, bu başka bir soru :) - Bir uygunluk sorunu. Bu yaklaşımın doğruluğu / okuryazarlığı sorusuyla da ilgileniyorum.
 
Yedelkin :
Peki, bu başka bir soru :) - Bir uygunluk sorunu. Bu yaklaşımın doğruluğu / okuryazarlığı sorusuyla da ilgileniyorum.

Evet, işaretçi doğru şekilde kaldırılırsa tüm varyantlar iyidir.

Ve bellek sızıntısı görünmeyi bıraksa bile kaldırılmış gibi görünüyor (FIG, geçen sefer neden çıktığını biliyor) ...

 
Interesting :

Evet, işaretçi doğru şekilde kaldırılırsa tüm varyantlar iyidir.

Ve bellek sızıntısı görünmeyi bıraksa bile kaldırılmış gibi görünüyor (FIG, geçen sefer neden çıktığını biliyor) ...

Yandan havalı görünüyor - nesne kendi kendine çarpıyor.
 
Yedelkin :
Yandan havalı görünüyor - nesne kendi kendine çarpıyor.

Güzel bir şey yok - herkesi "söndürmek" ...

Bu kod biraz daha havalı (dizideki her şey çöküyor).

Ama en havalı şey, dizinin bir alt sınıfa gömülü olması...

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

Polimorfizm sorusu.

Belgelerde bu örneğe sahiptir:

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


Tam olarak ne olması gerektiğini anlamıyorum.

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

En az 1 örnek verebilir misiniz?

Ve neden dizinin boyutu değişkenin kendisi tarafından değil de değişkenin türü tarafından gösteriliyor?

Ayrıca , belgelerin aynı bölümünde, sınıf bildirimlerinde hatalar var gibi görünüyor:

class  CShape{};

class  CCircle{} :  public  CShape

class  CSquare{} :  public  CShape

 
equivalent23 :

Ve neden dizinin boyutu değişkenin kendisi tarafından değil de değişkenin türü tarafından gösteriliyor?

Bundan mı bahsediyorsun?
CShape[ 10 ] shapes;                       // массив объектов CShape

Saf yazım hatası.

eşdeğer23 :

Ayrıca , belgelerin aynı bölümünde, sınıf bildirimlerinde hatalar var gibi görünüyor:

class  CShape{};

class  CCircle{} :  public  CShape

class  CSquare{} :  public  CShape

Bildirilen sınıfın adından sonra süslü parantezlerden mi bahsediyorsunuz?

 
equivalent23 :

Polimorfizm sorusu.

Belgelerde bu örneğe sahiptir:

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

Tam olarak ne olması gerektiğini anlamıyorum.

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

En az 1 örnek verebilir misiniz?

Belgelerden alıntıladığınız örnekten önce şöyle bir ifade var: "Artık Shape türünde bir dizi bildirebilir ve onu türetilmiş sınıfların nesneleriyle doldurabiliriz." Bu nedenle, shape[10] dizisi, CShape'den türetilen sınıf örnekleriyle doldurulmalıdır. Doğru şekilde?

Aynı belgede iki türetilmiş sınıf örneği vardır: CCircle ve CSquare. Bu nedenle, bu iki sınıfın örneklerini oluşturmak bize kalır, örneğin:

CCircle  objCircle;
CSquare  objSquare;

...ve şekiller[10] dizimizin ilk iki öğesini bunlarla doldurun:

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

Katılıyor musun?

 
Yedelkin :

Belgelerden alıntıladığınız örnekten önce şöyle bir ifade var: "Artık Shape türünde bir dizi bildirebilir ve onu türetilmiş sınıfların nesneleriyle doldurabiliriz". Bu nedenle, shape[10] dizisi, CShape'den türetilen sınıf örnekleriyle doldurulmalıdır. Doğru şekilde?

Aynı belgede iki türetilmiş sınıf örneği vardır: CCircle ve CSquare. Bu nedenle, bu iki sınıfın örneklerini oluşturmak bize kalır, örneğin:

...ve şekiller[10] dizimizin ilk iki öğesini bunlarla doldurun:

Katılıyor musun?

Kabul edebilirim, ancak derleyici bir hata veriyor:

'shape' - yapının nesneleri var ve kopyalanamaz test.mq5 36 3

 
equivalent23 :

Kabul edebilirim, ancak derleyici bir hata veriyor:

'shape' - yapının nesneleri var ve kopyalanamaz test.mq5 36 3

Tam kodu verebilir misiniz?
 
Yedelkin :
Tam kodu verebilir misiniz?

Kesinlikle:

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

 
 

Neden: