MQL5 コンパイラはクラスとそのポインタを区別しない - ページ 11

 
Ilya Malev:

これですね。(* )はここでは必要ありません。

* は,ポインタに直接 =, ==, !=, !& または || を適用する場合のみ,µl で必要とされます。

IMHOでは、これはまさに必要なことで、自分が扱っているもの(オブジェクトまたはそれへのポインタ)を忘れないようにするためのものです。

イリヤ・マレフ

(もう一度削除して、なかったことにしたい場合)))

そう、そうなんです。ポインターを使った開発がさらに進めば、C++の完全なクローンになってしまう。

おそらく、C#のように「マネージドコード」にはポインタがなく、一般的な型であるbool int doubleなどもすべてオブジェクトを持つという方向に行くのだろう。

 
Ilya Malev:

また、ついでに言うと、すべての公式チャンネル(フォーラム、ヘルプ、ドキュメント)がオペレータ * について沈黙しているので、おそらく管理者は再び削除して、存在しなかったことにしようと考えているのかもしれません))) 。だから、今のところ一般的な使い方に頼るのは危険だとイミフです。

沈黙しているのは、99.9%のユーザーがすべて気にしていないからでしょう。そして、 必要な人は、それを求め、手に入れた のです。

あなたも今までこの機能を気にしていなかったのでしょう? そして今、あなたは必死に知らなかったと言い訳を始めています ;) それがいつ導入されたのか、すぐになのか、数ヶ月後なのかの違いは何ですか? 私が教えなければあなたはまだ知らなかったのです )

 

うーん...。もしかしたら、配列へのポインタもあるのでは?調べてみないと...。とても寂しいです...。

 
Georgiy Merts:

うーん...。もしかしたら、配列へのポインタもあるのでは?調べてみないと...。とても寂しいです...。

いいえ、クラス内に配列を置く必要があります、彼らはポインタを持っています。

 
Ilya Baranov:

いいえ、クラス内に配列を置く必要があります。配列にはポインタがあります。

はい、残念です。

実は、CArrayの派生クラスは、私にとってかなり便利なものです。配列へのポインタが欲しいのはインジケータだけで、配列への参照を渡され、その参照をオブジェクトの全階層に「ドラッグ」しなければならず、非常に不便です...。

以前、配列へのポインタを作るか、配列リンクではなくStandard Libraryの 配列へのポインタを使うような指示関数を作ろうと提案したことがあるのですが、残念ながら「配列へのポインタを許すと初期化されていない配列を使えるようになる」という理由で却下されました、オブジェクトでは開発者はそんな恐れはないのですが......。ええ、まあ、それは彼らの良心に任せます。

 
Georgiy Merts:

2.MQLは選択しなかったものを削除する必要がない。Dmitriyの言う通り、オブジェクトを作成し、それを削除する。 私はC#の「ゴミ収集器」という慣習が好きではない。オブジェクトは、私が削除したいときではなく、収集器が削除したいと思ったときに削除 される。

C#のピッカーは、ライブオブジェクトやポインターを削除することはありません。その目的は、コープスヒープからゴミを取り除き、時にはデフラグを行うことです。

 
Alexey Volchanskiy:

C#のアセンブラは、ライブオブジェクトやポインタを削除することはありません。その目的は、ヒープから死体のゴミを取り除き、時にはデフラグすることである。

ゴミ収集機がライブオブジェクトやポインタを削除するとは言っていない。何が言いたいかというと、消したいときに消すということです。そして、これは良くないと私は思っています。

削除の有無にかかわらず、仕事ができるしかも、スマートポイントまで作れてしまう...。とはいえ、モノの削除は可能でなければならないし、作った本人がそのモノを削除しなければならないと思っています。

そういう古いタイプのオールドタイマーなんです。

 
SemenTalonov:

おそらく、C#のように「マネージドコード」にポインターを持たず、単純なbool int doubleなどの型も すべてオブジェクトにする方向に行くのだろう。

しかし、アンマネージドコードでポインターを扱う可能性は残されています。確かに、このようなコードには配布制限があります。

 
Georgiy Merts:

ゴミ収集機がライブオブジェクトやポインタを削除するとは言っていない。何が言いたいかというと、消したいときに消すということです。そして、これは良くないと私は思っています。

削除の有無にかかわらず、仕事ができるしかも、スマートポイントまで作れてしまう...。しかし、それでも、オブジェクトは削除されるべきであり、それを作成した者が削除するべきだと思います。

そういう古いタイプのオールドタイマーなんです。

ジョルジュ、例を挙げてくれないか、理解できないんだ。そういうことですか?自分でスマートポイントを作ることができるのでしょう。

bool first = false;

int Foo()
{
  int i;
  if(!first)
  {
     first = true; 
     i = 123;
  }
  return i;   
}

// И ты будешь надеятся, что i сохранит свое значение между сотней вызовов Foo? Может да (очень редко, если Foo вызывается 100 раз подряд), а может и нет.
 
Alexey Volchanskiy:

ジョルジュ、例を挙げてくれないか、理解できないんだ。そういうことですか?スマートポイントを自分で作ることも可能でしょう。

この場合、ブロックの終了時に変数を削除しなければならないことは明らかです。

newで作成したオブジェクトの話です。

CMyObj* pmoObject  = new CMyObject;

C#規格で規定されている。"構造体などの値型オブジェクトもクラスなどの参照型オブジェクトも自動的に破棄されるが、値型オブジェクトはそれを含むコンテキストが破壊されたときに破棄され、参照型オブジェクトはそのオブジェクトへの最後の参照が削除された後、ゴミ収集者によって無期限に破棄 される。"

ここで、私はこの「無期限」というのが気に入らない。しかし、ゴミ収集機は、オブジェクトを作成したクラスのデストラクタでオブジェクトを削除することで、私よりもはるかに効率的にオブジェクトを削除できることも認めます。