Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
Interesting:
アレキサンダーが提案した方法(AlexSTAL)で解決できたかもしれません(ある種の問題性は考慮しないことにしましょう)。
おい、おい、おい、おい!
私は提案したのではなく、可能性があると言ったのです。
で、何が問題なんだ、俺には理解できないのか?
ロジックの半分が欠落し、半分が間違っている例(OOPの創成期から残っている)を論じているのでしょう?
おい、おい、おい、おい!
提案したのではなく、可能性があると言ったのです。
で、何が問題なんだ、俺には理解できないのか?
例えば、異なるオブジェクトを配列に入れる必要があるとします。
同時に、これらのオブジェクトのすべてのプロパティは同じ配列に格納され、すべてのイベントとメソッドにアクセスできるようにする必要があります。
私が理解する限り、あなたが提供する可能性(実装は異なるかもしれません)は、オブジェクトの機能(イベントとメソッド)にアクセスすることができます。
しかし、祖先の型を持つ配列にデータを格納することは、(このデータが祖先で宣言されていないことを考えると)うまくいきそうにありません。
私の考えをはっきりさせましょう。
この特殊な例で止めるなら
1.例えば、オブジェクトの種類、Xの位置、Yの位置を格納する配列を作成することができます。
2.ポインタによって一意なオブジェクトを識別しようとすることもできる(ただし、オブジェクトを扱う ときにはポインタは使われないかもしれない、ならばハンドルのようなものがあったほうが望ましい)。
愚問ですが(他に解決策が見当たらない)、なぜポインタをハンドルとして使うのでしょうか(祖先でプロパティを作成し、コンストラクタでそれを埋める)?
子孫のプロパティを配列に格納する機能は得られません(祖先で定義されていないプロパティのみ)。例えば、私の理解する限り、円の半径や正方形の辺を配列に格納することはできません。
3. 配列に子孫のプロパティを格納する機能が得られない(祖先に鋳造されていないもののみ)。例えば、私の理解する限り、円の半径や正方形の辺を配列に格納することはできない。
なぜうまくいかないのか・・・。直接アドレスは指定せず、「GetValue」関数に「radius」パラメータ(オブジェクトが円の場合)を指定して使用します...。これはひとつの可能性として...。
シンプルで具体的なタスクを設定する
なぜうまくいかないのか・・・。直接アドレスは指定せず、「GetValue」関数に「radius」パラメータ(オブジェクトが円の場合)を指定して使用します...。これはひとつの可能性として...。
シンプルで具体的な問題を設定し
課題はシンプルですが、誰が見ても簡単に実行できます。
タスクは、様々なオブジェクト(ベースクラスの子孫)とそのデータを配列に記録することです。
彼らのデータとともに、明確にしましょう!!!
2.各子孫のGetArea()。
3.以下の機能を追加する。
a. 正方形の周囲-辺*4 を計算します。
б.円の外周-2πRの 計算。
3.ライブラリに長方形(2辺)、三角形を追加。
4.以下の機能を追加する。
a. 長方形の面積を計算する - 底辺×高さ。
б.長方形の周囲を計算する - 辺の和 *2;
в.三角形の面積を計算する。
г.三角形の外周の計算。
5.各オブジェクトを個別に(すべてのオブジェクトの中で、またそのクラスのオブジェクトの中で)識別する。
ポインターの 有無は問わない。
6. 配列に格納されたデータのみを使って、図形の周囲と面積を計算する。
追記
子孫から祖先にコードを移すことは許されません(このコードがすべての祖先に適用される場合を除く)。
例えば、正方形、長方形、円は半径を持たないので、半径を祖先に転送することはできません。
すべての子孫に適用される限り、新しい機能を先祖に追加することができます。
予告編にあるコードを基本としています。
一つの配列の中で、面積や周囲長を格納する変数を先祖に追加し、そこにデータを書き込む機能を追加するだけで、個人的には解決しました。
この場合、GetArea()などの直接計算の結果を制御すればよい。
私は自分のルールを破っていないようです。
おっしゃるようなアプローチを実現するための一つの方法をスケッチしてみました。
完全ではありませんが、最も重要なアプローチです。
おっしゃるようなアプローチで実装する方法を一つスケッチしてみました。
完全ではありませんが、最も重要なアプローチです。
アプローチは明確です。同じような問題を解決するための最適なソリューションの1つでしょう。
少なくとも今のところは。
タスクはシンプルですが、誰が簡単に実行できると言ったのでしょうか?
1. 課題は、異なるオブジェクト(基本クラスの子孫)を、そのデータとともに配列に書き込むことです。
...MQL5のスプレッドシートは、すでに問題を解決して記述しています。
読めたらどんなにいいか...。:)
また、これらのアプローチは、(タイプが異なるとはいえ)1つのパラメータのみの転送/読み取りで計算されると理解していますが、悪いアプローチではありません。
しかし、パラメータがたくさんあって、それらをすべてベースクラスに収めることが不可能な場合はどうすればいいのでしょうか?
私の理解では、渡すべきパラメータのインデックスを追加で入力する必要があります(また、パラメータをインデックスで積み重ねた配列をクラス内に作成することも可能です)。
読めたらどんなにいいか...。:)
また、これらのアプローチはどちらも1つのパラメータ(異なるタイプではありますが)のみを転送/読み取るために設計されていると私は理解していますが、悪いアプローチではありません。
また、パラメータがたくさんあって、それらをすべてベースクラスに含めることが不可能な場合はどうすればいいのでしょうか?
私の理解では、渡すパラメータのインデックスを入力することは可能なのでしょうか(クラス内でパラメータをインデックスで積み重ねた配列を作ることも可能です)。