MQL5におけるOOPに関する質問 - ページ 18

 

どう違うのか、教えてください。
このようにオブジェクト(ポインタ)を作成する ことで

class CClass
{
   public:


}CObj, *pCObj;

古典的なクリーチャーから

CClass  CObj;
CClass *CObj;

プロで異なる挙動に気づき、なぜだろうと思い始め、文献検索、最初の見方がわからない。

 
Roman:

どう違うのか、教えてください。
このようにオブジェクト(ポインタ)を作成する ことで

古典的なクリーチャーから

プラスで違う挙動に気づいた、なぜだろう、文献検索も、最初の探し方と言われてもわからない。

MQLでもプラスでも、差はありません。

 
Koldun Zloy:

それは、MQLでもプラスでも変わりません。

質問を理解していない。その違いは、言語ではなく、宣言そのものにある。
最初の例からオブジェクトの挙動が理解できない。
私の推測では、オブジェクトもスタック上に生成され、クラスのデストラクタが 呼ばれた後に破棄され、オブジェクトはコード内でグローバルに見えるようになっているのではないかと思います。
それを明確にしたかったのですが、最初のメソッドの動作はどうなっているのでしょうか?
私の推測は正しいでしょうか?
googleで探すと何というのでしょうか?

なぜなら、(mqlではなくC++で)オブジェクトを違う方法で作成すると、使用するメソッドでの動作が変わり、期待通りにならないことに気がついたからです。

 
Roman:

質問を理解していない。その違いは、言語ではなく、宣言そのものにある。
最初の例からオブジェクトの動作が理解できない。
私の推測では、オブジェクトもスタック上に作成され、クラスのデストラクタを 呼び出した後に破棄され、オブジェクトはコード内でグローバルに可視化されていると思います。
それを明確にしたかったのですが、最初のメソッドの動作はどうなっているのでしょうか?
私の推測は正しいでしょうか?
ググればわかるけど、なんていうんだっけ?

というのも、オブジェクトの作成方法が異なると、使用するメソッドでの挙動が変わり、期待通りにならないことに気づいたからです。

質問の内容は理解できました。広告に差はありません。

 
Koldun Zloy:

質問の内容は理解できました。広告に差はありません。

その違いは、スコープにある可能性が高い。
あるファイルの最初の例は常にグローバルに表示され、2番目の例や新しい例は、関数で非表示にすることができます。

 
Roman:

その違いは、スコープにある可能性が高い。
あるファイルの最初の例は常にグローバルに表示され、2番目の例や新しい例は、関数内で非表示にすることができます。

ここで違うのは、どう宣言するかではなく、どこで宣言するかということです。

 
Koldun Zloy:

ここで違うのは、どう宣言するかではなく、どこで宣言するかということです。

私も、論理的な推論によって、その結論に至りました :))
自分の考えが正しいかどうか、確かめたかったのです。分かりやすい説明ありがとうございました。

 
Vladimir Simakov:
   lotDigits=MathMax(-(int)MathFloor(MathLog10(lotStep)),0);

確認したところ、このコードは小数点を計算するために正しく動作していませんでした。

基本的に私のも正しく動作するとは限りません、それは分かっています。

スクリプトで確認することができます。

void OnStart()
  {
   double l=0.0;
   for(int i=0; i<100; i++)
     {
      Print(l," ---> LotDigits / MyDigits = ",LotDigits(l)," / ",MyDigits(l));
      l+=0.003;
     }
  }
//+------------------------------------------------------------------+
int LotDigits(double value)
  {
   return(MathMax(-(int)MathFloor(MathLog10(value)),0));
  }
//+------------------------------------------------------------------+
int MyDigits(double v)
  {
   long i=10000000,k=long(v/0.0000001);
   int d=0;
   while(d<7 && k%i>0)
     {
      i/=10;
      d++;
     }
   return(d);
  }
//+------------------------------------------------------------------+

スクリプトのログを添付しています。

ファイル:
20190829.log  9 kb
 
Roman:

どう違うのか、教えてください。
このようにオブジェクト(ポインタ)を作成する ことで

古典的なクリーチャーから

プロでは、違う挙動に気づき、なぜだろうと考え、文献検索では、最初の調べ方を何と呼べばいいのかもわからない。

個人的には、私もあまり違いを感じませんが、このような書き方そのものが、私にはかなり危険なように思えます。

ポインタは、生成時に直ちにNULLか、実オブジェクトへのポインタのどちらかに等しくなければならない。このポインタが格納される小さなメモリ空間が生成され、NULL値または通常のポインタとして格納されます。

一方、オブジェクトの宣言は、オブジェクト全体を作成し、コンストラクタを呼び出してメモリを確保する。

 
Igor Makanu:

確認したところ、このコードは小数点以下の桁数を計算するために正しく動作していません。

基本的に私のも正しく動作するとは限りません、それは分かっています。

スクリプトで確認することができます。

スクリプトのログを添付しています。

0.15とか、多くはないだろうという前提があります。少なくとも私は聞いたことがない。ふと見かけたら、やり直します。