巴解组织。应用问题 - 页 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());
  };


不太清楚应该怎么做

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

我可以至少有一个例子吗?

还有,为什么数组的大小是为变量类型而不是为变量本身指定的?

此外,在文档的同一章中,声明类似乎也有错误。

class CShape{};

class CCircle{} : public CShape

class CSquare{} : public CShape

 
equivalent23:

还有,为什么数组的维度是由变量类型指定的,而不是由变量本身指定的?

你是这个意思吗?
CShape[10] shapes;                       // массив объектов CShape

这纯粹是一个打字错误。

23:

此外,在同一个文档章节 中,类的声明似乎也有错误。

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());
  };

我不太清楚应该怎么做。

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

我可以至少有一个例子吗?

在你的文档中的例子之前,有这样一句话:"现在我们可以声明一个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' - 结构有对象,不能被复制 test.mq5 36 3

 
equivalent23:

我可能会同意,但编译器会产生一个错误。

'shape' - 结构有对象,不能被复制 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);
  }
//+------------------------------------------------------------------+