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

 

技術的な参考資料です。クラスを扱う際の「包み込む仕組み」の一例(検索する必要がないように)。

https://www.mql5.com/ru/forum/3555/page3#comment_57315

Ограничение кеша индикатора.
Ограничение кеша индикатора.
  • www.mql5.com
Но вот нет никакой возможности ограничить автоматическую загрузку данных в кеш индикатора.
 

質問です。新しいオペレーターです。リファレンスマニュアルでは、newは演算子であるとされていますが、例題では、この演算子を使った後に、NULLと等しいかどうかのチェックが行われることが多いようです。例えば、こんな感じです。

//+------------------------------------------------------------------+
//| Создание фигуры                                                  |
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
  {
   m_ypos=HORZ_BORDER;
//--- случайным образом создаём одну из 7 возможных фигур
   int nshape=rand()%7;
   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }
//--- отрисовываем
   if(m_shape!=NULL)
     {
      //--- начальные установки
      m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
      m_shape.SetYPos(m_ypos);
      m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
      //--- отрисуем
      m_shape.Draw();
     }
//---
  }

また、「NULLは new演算子で作成されたオブジェクトへのポインタと比較できる」とも言われています。

つまり、newオペレータは常に新しいオブジェクトを生成するわけではないことがわかったのですね。それとも、作成したオブジェクトが NULLに等しいかどうかのチェックは、開発者のスタイルの特質であり、義務ではないのでしょうか?

 
Yedelkin:

質問です。新しいオペレーターです。リファレンスマニュアルでは、newは演算子であるとされていますが、例題では、この演算子を使った後に、NULLと等しいかどうかのチェックが行われることが多いようです。例えば、こんな感じです。

また、「NULLは new演算子で作成されたオブジェクトへのポインタと比較できる」とも言われています。

つまり、newオペレータは常に新しいオブジェクトを生成するわけではないことがわかったのですね。それとも、作成したオブジェクトが NULLに等しいかどうかのチェックは、開発者のスタイルの特質であり、義務ではないのでしょうか?

プログラムのある場所でダイナミック・オブジェクトを作れば、別の場所ではそれを破壊するのが道理であり、これがすべて1つの関数内にあるという事実はなく、それゆえポインタを使う前に、それが存在するかどうかをチェックするのが簡単な経験則なのです。
 
Urain:
プログラムのある場所でダイナミック・オブジェクトを作れば、別の場所でそれを破壊するのが道理であり、それがすべて1つの関数内にあるとは限らないので、ポインタを使う 前に存在するかどうかをチェックするのが簡単なルールである。

これは正しい。しかし、リファレンスマニュアルの例では、オブジェクトが作成された直後、つまりプログラム内のある場所、ある関数内でチェックが行われています。そして、ここで示されたルールは、全く的を射ていない。なぜ、オブジェクトの生成直後にチェックを行う必要があるのでしょうか?つまり、newオペレータは常に新しいオブジェクトを生成するわけではないことがわかったのですね。=(Iリピート)=。

ここで、数ある例の中から、もう一つ紹介します。

//--- example for CArrayString::Add(string)
#include <Arrays\ArrayString.mqh>
//---
void OnStart()
  {
   CArrayString *array=new CArrayString;
   //---
   if(array==NULL)
     {
      printf("Object create error");
      return;
     } 
 
Yedelkin:

これは正しい。しかし、リファレンスマニュアルの例では、オブジェクトが作成された直後、つまりプログラム内の1箇所、1つの関数内でチェックが行われています。そして、上記のルールはここでは適用されません。なぜ、オブジェクトを作成した直後にチェックを行う必要があるのでしょうか?つまり、new演算子が常に新しいオブジェクトを作成するわけではないことが判明したわけですね(繰り返すけど)

ここで、数ある例の中から、もう一つ紹介します。

こんな可能性もあります。ヘルプの、最初の段落。
 
Lizar:
そんな可能性もあるのです。参考までに、第1段落。
OKです。演算子の振る舞いは、関数のようなものであることがわかりました。作るかもしれないし、作らないかもしれない。
 
Yedelkin:
OKです。演算子の振る舞いが関数のそれであることがわかった。作られるかもしれないし、作られないかもしれない。
例えば、オブジェクトに十分なメモリがないなど。
 
Rosh:
例えば、あるオブジェクトに対して十分なメモリがなかったとします。
簡単な説明で、かなり視野が広がることもあります。ありがとうございました。
 

質問です。親クラスで特定のパラメータと型を持つ仮想関数を 宣言した後、派生クラスで対応する仮想関数のパラメータの数と型を変更することは可能ですか?

一方、リファレンスマニュアルでは、「派生クラスで 仮想関数を代用 することができる」とされています。仮想関数に対してどの 関数定義を 呼び出すかは動的に(実行時に)選択 される。典型的なケースは、ベースクラスがその関数を含み、派生クラスがその関数の独自のバージョンを 持つ場合 です一方、リファレンスマニュアルに記載されている例は、仮想関数が関数定義ヘッダではなく 、関数定義体を 持つ場合について言及しています。

 
Yedelkin:

質問です。親クラスで、あるパラメータとその型を持つ仮想関数を 宣言した後、子クラスで、対応する仮想関数のパラメータの数と型を変更することは可能ですか?

デフォルトのパラメータを除いた、定義の完全なコピーのみ(デフォルトは異なる場合がありますが、これを使用しない方がよいでしょう)