PLOです。アプリケーションの問題 - ページ 11

 
Interesting:

読めたらどんなにいいか...。:)

また、これらのアプローチは、(タイプが異なるとはいえ)1つのパラメータのみの転送/読み取りで計算されると理解していますが、悪いアプローチではありません。

しかし、パラメータがたくさんあって、そのすべてをベースクラスに入れることができない場合、どのように解決すればいいのでしょうか?

私が理解する限り、渡すパラメータのインデックスを入力する必要があります(インデックスでパラメータを格納した配列をクラスで作成することもできます)?

私もよくわからないのですが...。

この例では、インデックスがありますが、明示的な数値ではなく、列挙型です...。

 

忘れてください、そんな価値ないですよ。

 

Interesting:

イェデルキン

一般的には、問題点を議論した後、https://www.mql5.com/ru/forum/3566/page6#comment_58280、SRにアプリケーションを送った。

1.どうだろう、どうだろう。

開発者が、セキュリティのために機能を犠牲にしてまで、一定の措置を取るとは思えません(一方では当然のことですが)。

報告すること。

アプリケーションはこんな感じでした。
...

提案します。

1.ポリモーフィズム」ハンドブックの「ポリモーフィズム」のセクションを、CShapeから派生したクラスのインスタンスで配列シェイプ[10]を正しく埋める方法を指定する点で明確にしなさい(例を挙げなさい)。

2.文字列が正しく書かれているか確認する。

CShape[10] shapes;                       // массив объектов CShape

3.クラスを宣言するとき、宣言されるクラス名の直後に中括弧を付けるかどうかを説明しなさい。

クラス CShape{};

class CCircle{} :public CShape.

class CSquare{} :public CShape.

対応する。

ラシード・ウマロフ 2011.04.11 15:17

ヘルプを書いた時点では、まだドキュメントが明確になっていない点がありました。この点を修正し、正しいコードを追加します。メッセージをありがとうございました。

ヘルプに拡張説明が追加される予定ですが、ここではその抜粋を紹介します。

このプログラムでは、1つの基本型CShapeを継承した異なる型(CCircleとCSquare)のオブジェクトを使用することを想定しています。ポリモーフィズムにより、基本型CShapeのオブジェクトの配列を作ることができますが、この配列を宣言しても、オブジェクト自体は未知で型も未定義です。

配列の各要素にどの種類のオブジェクトを入れるかは、プログラムの実行中に決定される。これは、対応するクラスのオブジェクトが動的に生成されることを意味し、したがって、オブジェクトそのものではなく、オブジェクトポインタを使用する必要がある。

オブジェクトを動的に生成するには、newオペレータを使用する。そのようなオブジェクトは、それぞれ独立して、明示的にdeleteオペレータで削除する必要がある。そこで、サンプルスクリプトのように、CShape型のポインタの配列を宣言し、その要素(new_class_name)ごとに必要な型のオブジェクトを作成することにします。

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

//--- объявим массив указателей объектов базового типа 

   CShape *shapes[5];   // массив указателей на объекты CShape



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

//--- объявим указатель на объект типа CCircle

   CCircle *circle=new CCircle();

//--- задаем свойства объекта по указателю circle

   circle.SetRadius(2.5);

//--- поместим в shapes[0] значение указателя

   shapes[0]=circle;



//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]

   circle=new CCircle();

   shapes[1]=circle;

   circle.SetRadius(5);



//--- тут мы намеренно "забыли" задать значение для shapes[2]

//circle=new CCircle();

//circle.SetRadius(10);

//shapes[2]=circle;



//--- для неиспользуемого элемента установим значение NULL

   shapes[2]=NULL;



//--- создаем объект CSquare и запишем его указатель в shapes[3]

   CSquare *square=new CSquare();

   square.SetSide(5);

   shapes[3]=square;



//--- создаем объект CSquare и запишем его указатель в shapes[4]

   square=new CSquare();

   square.SetSide(10);

   shapes[4]=square;



//--- массив указателей есть, получим его размер

   int total=ArraySize(shapes);

//--- пройдем в цикле по всем указателям в массиве 

   for(int i=0; i<5;i++)

     {

      //--- если по указанному индексу указатель является валидным

      if(CheckPointer(shapes[i])!=POINTER_INVALID)

        {

         //--- выведем в лог тип и площадь фигуры

         PrintFormat("Объект типа %d имеет площадь %G",

               shapes[i].GetType(),

               shapes[i].GetArea());

        }

      //--- если указатель имеет тип POINTER_INVALID

      else

        {

         //--- сообщим об ошибке

         PrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",

                     i,EnumToString(CheckPointer(shapes[i])));

        }

     }



//--- мы должны самостоятельно уничтожить все созданные динамические объекты

   for(int i=0;i<total;i++)

     {

      //--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMIC

      if(CheckPointer(shapes[i])==POINTER_DYNAMIC)

        {

         //--- сообщим об удалении

         PrintFormat("Удаляем shapes[%d]",i);

         //--- уничтожим объект по его указателю

         delete shapes[i];

        }

     }

  }


delete演算子でオブジェクトを削除する場合、そのポインタの型を確認する必要があることに注意してください。ポインタ POINTER_DYNAMIC を持つオブジェクトのみ削除可能で、それ以外の型のポインタはエラーになります。

この例は、ポインターの配列を作るということを完全に網羅していると思います。
ラシード・ウマロフ 2011.04.11 10:31

投稿ありがとうございます。№2、№3を修正しました。新しいバージョンのヘルプに掲載される予定です



 

質問です。標準ライブラリは、以下の行を使用します。

void CTrade::Request(MqlTradeRequest& request) const
  {...}

リファレンスマニュアルには、「const 指定子は、構造体やクラスのメンバには適用されない」とあります。上記のクラスメソッドでconstを 使用することは、どのような意味があり、そのような場合の使用ルールはどのようなものでしょうか?

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Yedelkin:


上記のクラスメソッドにおける constの 使用は、どのような意味を持ち、このような場合に使用するためのルールは何でしょうか?

そうそう、私もずっと気になっていたんです。ゲームのルール」を十分に意識して、言葉を有意義に使いたいですね。
 
Yedelkin:

質問です。標準ライブラリは、以下の行を使用します。

リファレンスマニュアルには、「const 指定子は、構造体やクラスのメンバには適用されない」とあります。上記のクラスメソッドでconstを 使用することは、どのような意味があり、そのような場合の使用ルールはどのようなものでしょうか?

構造体/クラスのメンバと、メソッドは別物です。

constと記述されたメソッドは、そのクラスの状態/メンバを変更しないことを意味します。つまり、このようなメソッドを呼び出した後、クラスの内部状態は変化しない。これは、クラスのメンバを変更しようとする試みをチェックするよう、コンパイラに追加で指示するために使用されます。

 
Renat:

構造体/クラスメンバと メソッドは別物です。

constと記述されたメソッドは、そのクラスの状態/メンバを変更しないことを意味します。つまり、このメソッドが呼ばれた後も、クラスの内部状態は変化しない。これは、クラスのメンバを変更しようとする試みをチェックするよう、コンパイラに追加で指示するために使用されます。

すごい。ありがとうございました。そして、頭を悩ませました。

 
TheXpert:
ところで、ついでに論理的な質問なのですが、マニュアルはなく、期待できないのでしょうか?

どのような使い方ができるのでしょうか?スレッド同士が相互作用しないからです。

もし、スレッド間で自由にデータを転送できるのであれば、たしかにそのような命令は必要でしょう。

 
くそー、何か書き間違えてるのかと思った :) 今ならわかる。もちろん揮発性ではなく変異性 です :))
 
class COracleTemplate
  {
private:
public:
   string            filename;
                     COracleTemplate(){Init();};
                    ~COracleTemplate(){DeInit();};
   virtual void      Init(){filename=this.Name();Print("loadSettings from ",filename);};
   virtual void      DeInit(){Print("saveSettings to ",filename);};
   virtual string    Name(){return("Prpototype");};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCO2:public COracleTemplate
  {
   virtual string    Name(){return("CO2");};
  };
class CH2O:public COracleTemplate
  {
   virtual string    Name(){return("H2O");};
  };
COracleTemplate* CO2,*H2O;
void OnStart()
  {
   CO2=new CCO2;
   Print(CO2.Name()," filename=",CO2.filename);
   delete CO2;
   
   H2O=new CH2O;
   Print(H2O.Name()," filename=",H2O.filename);
   delete H2O;
   
  }

こんにちは。

そんな問いかけ。

上のコードについて

何がいけなかったのか、それともMT5では一般的に実現不可能なのか?

ファイル名変数で上書きされた名前を取得したいのですが。