PLOです。アプリケーションの問題 - ページ 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

これは純粋なタイプミスです。

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

何がどうあるべきなのか、よくわからない。

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

1つでも例があれば教えてください。

ドキュメントの例の前に、「これでShape型の配列を宣言し、派生クラスのオブジェクトで埋めることができます」というフレーズがあります。したがって、shapes[10]配列はCShapeから 派生したクラスのインスタンスで埋め尽くされる必要があります。そうだろ?

派生クラスの例として、CCircleとCSquareの2つが同じ文書に記載されています。 ですから、例えば、この2つのクラスのインスタンスを作成することが残されているのです。

CCircle  objCircle;
CSquare  objSquare;

...を作成し、配列shapes[10]の最初の2つの要素をそれらで埋めます。

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

あなたはそう思いますか?

 
Yedelkin:

ドキュメントの例の前に、「これでShape型の配列を宣言し、派生クラスの オブジェクトで埋めることができます」というフレーズがあります。したがって、配列shapes[10]には、CShapeから 派生したクラスのインスタンスを格納する必要があります。そうだろ?

派生クラスの例として、CCircleとCSquareの2つが同じ文書に記載されています。 ですから、例えば、この2つのクラスのインスタンスを作成することが残されているのです。

...を作成し、配列shapes[10]の最初の2つの要素をそれらで埋めます。

あなたはそう思いますか?

同意しても、コンパイラはエラーを発生させる。

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