ООП. Вопросы применения - страница 6

 
Interesting:

Даже если предположить что void Del(C_A *p) в предке будет достаточно для удаления указателя любого потомка то не вижу смысла использовать

Ну это уже другой вопрос :)  - Вопрос целесообразности. Меня же интересует вопрос правильности/грамотности такого подхода.
 
Yedelkin:
Ну это уже другой вопрос :)  - Вопрос целесообразности. Меня же интересует вопрос правильности/грамотности такого подхода.

Да вроде все варианты хороши, если корректно удаляется указатель.

А он вроде удаляется, лаже утечка памяти перестала появляться (фиг его знает почему в прошлый раз вылезла)...

 
Interesting:

Да вроде все варианты хороши, если корректно удаляется указатель.

А он вроде удаляется, лаже утечка памяти перестала появляться (фиг его знает почему в прошлый раз вылезла)...

Со стороны прикольно выглядит - объект грохает сам себя.
 
Yedelkin:
Со стороны прикольно выглядит - объект грохает сам себя.

Ничего прикольного - уходя "гасите" всех...

Вот такой код немного прикольней (грохается все что в массиве).

Но самое прикольное если массив встроить в класс-потомок...

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

Вопрос по полиморфизму.

В документации есть такой пример:

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


Не совсем понял что должно быть на месте

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

Можно хотя бы 1 пример?

И почему размерность массива указывается у типа переменной а не у самой переменной?

Кроме того в этой же главе документации кажется есть ошибки в объявлении классов:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 
equivalent23:

И почему размерность массива указывается у типа переменной а не у самой переменной?

Вы про это?
CShape[10] shapes;                       // массив объектов CShape

Опечатка в чистом виде.

equivalent23:

Кроме того в этой же главе документации кажется есть ошибки в объявлении классов:

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 Вы про фигурные скобки после имени объявляемого класса?

 
equivalent23:

Вопрос по полиморфизму.

В документации есть такой пример:

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

Не совсем понял что должно быть на месте

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

Можно хотя бы 1 пример?

Перед приведённым Вами примером из документации есть такая фраза: "Теперь мы можем объявить массив типа Shape и заполнить его объектами производных классов". Поэтому массив  shapes[10] следует заполнить экземплярами классов, производных от CShape. Правильно?

В той же документации есть два примера производных классов: CCircle и CSquare. Поэтому нам остаётся создать экземпляры этих двух классов, например:

CCircle  objCircle;
CSquare  objSquare;

... и  заполнить ими первые два элемента нашего массива shapes[10] :

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

Согласны?

 
Yedelkin:

Перед приведённым Вами примером из документации есть такая фраза: "Теперь мы можем объявить массив типа Shape и заполнить его объектами производных классов". Поэтому массив  shapes[10] следует заполнить экземплярами классов, производных от CShape. Правильно?

В той же документации есть два примера производных классов: CCircle и CSquare. Поэтому нам остаётся создать экземпляры этих двух классов, например:

... и  заполнить ими первые два элемента нашего массива shapes[10] :

Согласны?

Я то может быть и согласен, но компилятор выдает ошибку:

'shape' - structure have objects and cannot be copied    test.mq5    36    3

 
equivalent23:

Я то может быть и согласен, но компилятор выдает ошибку:

'shape' - structure have objects and cannot be copied    test.mq5    36    3

А полный код привести можете?
 
Yedelkin:
А полный код привести можете?

Конечно:

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