MQL5におけるOOPに関する質問 - ページ 44 1...373839404142434445464748495051...96 新しいコメント Sergey Dzyublik 2020.04.18 17:23 #431 Igor Makanu: 私はそうは思いません。 代入演算子」と「コピーコンストラクタ」とは何か、どう違うのか、いつ、どのように(明示的、暗黙的に)呼び出されるのか、知識を更新してください。 このコードでは、関数からローカル変数が返されると、デフォルトのコピーコンストラクタ(代入演算子と混同しないように)が呼び出されることを黄色で強調表示しています。 完全なデータ型」とは何か、残念ながら完全には解明されていませんし、あなたのコードで何を証明しようとしたのかも不明です...。 繰り返しますが、"MQLのデフォルトの代入演算 子はvoidデータ型を返す; " です。 struct A{ int x,y; }; void OnStart(){ A a, b; Print(typename(a = b)); // void } Igor Makanu 2020.04.18 17:28 #432 Koldun Zloy: 間違っている。 これを返すoperator=を定義するだけで、その違いがわかる。 課題の結果を再度割り当てると、その違いがよくわかります。 operator=を定義すると、デフォルトの::=を呼び出すという最初の目的から外れてしまう。 解けない問題のようです。 セルゲイ・デジュブリク 完全なデータ型」が何を意味するのか、残念ながら明確ではありません。 fullは完全 -データ構造は 保存され、新しいフィールドを追加しても構造のコピーを制御する必要はない。 Koldun Zloy 2020.04.18 17:32 #433 Igor Makanu: 演算子=を定義すると、デフォルトの::=を呼び出すという最初の目的から外れてしまいます。 こんな課題、本当に必要ですか? b = c = a; Sergey Dzyublik 2020.04.18 17:48 #434 Igor Makanu: completeは完全 -データ構造は 保存され、新しいフィールドが追加されても構造のコピーを制御する必要はない それから、あなたの専門用語によれば、デフォルトの代入演算子を呼び出すと、「不完全なデータ型」を与える可能性があるとのことです。 2019.05.03のバグは修正されませんでした: https://www.mql5.com/ru/forum/1111/page2451#comment_11556395 Igor Makanu 2020.04.18 18:46 #435 Koldun Zloy: そんな課題が本当に必要なのか? 純粋に理論上、演算子ではなく「新しい実体」であるかどうかを知りたい =。 実用には全く必要ないので、2つのオペレーターに入れても問題なし セルゲイ・デジュブリク それから、あなたの専門用語によれば、デフォルトの代入演算子を呼び出すと、「不完全なデータ型」を与えることができるそうです。 2019.05.03のバグは一度も修正されていないhttps://www.mql5.com/ru/forum/1111/page2451#comment_11556395。 "私の専門用語 "は、尋ねること、文句を言わないことです。 しかし,デフォルトの演算子 = を使う意味は,構造体のフィールドだけを記述するのに便利で,配列の次元も含めてすべてがコピーされることです(ただし,次元が増えるだけです - 動作原理は ArrayCopy() と同じです). まあ、バグならここまでしないとね。 Igor Makanu 2020.04.19 21:48 #436 という質問は、純粋に理論的なものです。 は、おそらくSBで、このようなコンストラクタの呼び出しを見たことがあります。 class A{ public: A(){Print(__FUNCTION__);} }; class B{ public: A a1,a2; B():a1(),a2() { Print(__FUNCTION__); } }; このコードはどう違うのでしょう。 class A{ public: A(){Print(__FUNCTION__);} }; class B{ public: A a1,a2; B() { Print(__FUNCTION__); } }; ではもう少し具体的に、a1 と a2 オブジェクトの強制コンストラクタ呼び出しを使用できるのはなぜですか? 最初の選択肢の「便利さ」とは何でしょうか? Maxim Kuznetsov 2020.04.19 21:57 #437 Igor Makanu: という質問は、純粋に理論的なものです。 は、おそらくSBで、このようなコンストラクタの呼び出しを見たことがあります。 このコードはどう違うのでしょう。 ではもう少し具体的に、a1 と a2 オブジェクトの強制的なコンストラクタ呼び出しを使用できるのはなぜですか? 最初の選択肢の「便利さ」とは何でしょうか? コンストラクタはパラメータを持つことができ、それらは何らかの方法で渡さなければなりません。 つまり、パラメータがないところまでは差がないのですが、コンストラクタA(int arg)を使うとなると話は別です Igor Makanu 2020.04.19 22:09 #438 Maxim Kuznetsov: コンストラクタにはパラメータがあり、何らかの方法で渡す必要があります。 つまり、パラメータがないところまでは、その違いは重要ではありません。 しかし、コンストラクタA(int arg)がある場合は、話は別です 目的によって使い分けるのが正解でしょう 最初の変形では、クラスBの 2つのコンストラクタを 使いたいときに、両方のコンストラクタで重複したコードを受け取ってしまい、それらを削除したところ、最初の変形にあったコードの一部しか得られず、どこでそれを見たのか、なぜそのように書いたのかという疑問が生じてしまいました ))) Sergey Dzyublik 2020.04.20 00:27 #439 Igor Makanu: オブジェクト a1 と a2 のコンストラクタを強制的に使用させることができるのはなぜか? 正しい処理名は「強制的にコンストラクタを呼び出すa1、a2」ではなく、クラス(非静的)フィールドの初期化です。 の場合、義務付け。 - 定型のクラスフィールドを使用する。- クラスフィールドのデフォルトコンストラクタがないことです。- コンストラクタ呼び出し以外の方法でオブジェクトを初期化する方法がない(例えば、代入演算子が削除されている)。-... Dmitry Fedoseev 2020.04.20 02:28 #440 どなたか、このフィールドの初期化がどのように良いのか説明していただけませんか? CArray::CArray(void) : m_step_resize(16), m_data_total(0), m_data_max(0), m_sort_mode(-1) { } はこれよりマシです。 CArray::CArray(void) { m_step_resize=16; m_data_total=0; m_data_max=0; m_sort_mode=-1; } そして、そもそも何が言いたいのか? 1...373839404142434445464748495051...96 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
私はそうは思いません。
代入演算子」と「コピーコンストラクタ」とは何か、どう違うのか、いつ、どのように(明示的、暗黙的に)呼び出されるのか、知識を更新してください。
このコードでは、関数からローカル変数が返されると、デフォルトのコピーコンストラクタ(代入演算子と混同しないように)が呼び出されることを黄色で強調表示しています。
完全なデータ型」とは何か、残念ながら完全には解明されていませんし、あなたのコードで何を証明しようとしたのかも不明です...。
繰り返しますが、"MQLのデフォルトの代入演算 子はvoidデータ型を返す; " です。
間違っている。
これを返すoperator=を定義するだけで、その違いがわかる。
課題の結果を再度割り当てると、その違いがよくわかります。
operator=を定義すると、デフォルトの::=を呼び出すという最初の目的から外れてしまう。
解けない問題のようです。
完全なデータ型」が何を意味するのか、残念ながら明確ではありません。
fullは完全 -データ構造は 保存され、新しいフィールドを追加しても構造のコピーを制御する必要はない。
演算子=を定義すると、デフォルトの::=を呼び出すという最初の目的から外れてしまいます。
こんな課題、本当に必要ですか?
completeは完全 -データ構造は 保存され、新しいフィールドが追加されても構造のコピーを制御する必要はない
それから、あなたの専門用語によれば、デフォルトの代入演算子を呼び出すと、「不完全なデータ型」を与える可能性があるとのことです。
2019.05.03のバグは修正されませんでした: https://www.mql5.com/ru/forum/1111/page2451#comment_11556395
そんな課題が本当に必要なのか?
純粋に理論上、演算子ではなく「新しい実体」であるかどうかを知りたい =。
実用には全く必要ないので、2つのオペレーターに入れても問題なし
それから、あなたの専門用語によれば、デフォルトの代入演算子を呼び出すと、「不完全なデータ型」を与えることができるそうです。
2019.05.03のバグは一度も修正されていないhttps://www.mql5.com/ru/forum/1111/page2451#comment_11556395。
"私の専門用語 "は、尋ねること、文句を言わないことです。
しかし,デフォルトの演算子 = を使う意味は,構造体のフィールドだけを記述するのに便利で,配列の次元も含めてすべてがコピーされることです(ただし,次元が増えるだけです - 動作原理は ArrayCopy() と同じです).
まあ、バグならここまでしないとね。
という質問は、純粋に理論的なものです。
は、おそらくSBで、このようなコンストラクタの呼び出しを見たことがあります。
このコードはどう違うのでしょう。
ではもう少し具体的に、a1 と a2 オブジェクトの強制コンストラクタ呼び出しを使用できるのはなぜですか?
最初の選択肢の「便利さ」とは何でしょうか?
という質問は、純粋に理論的なものです。
は、おそらくSBで、このようなコンストラクタの呼び出しを見たことがあります。
このコードはどう違うのでしょう。
ではもう少し具体的に、a1 と a2 オブジェクトの強制的なコンストラクタ呼び出しを使用できるのはなぜですか?
最初の選択肢の「便利さ」とは何でしょうか?
コンストラクタはパラメータを持つことができ、それらは何らかの方法で渡さなければなりません。
つまり、パラメータがないところまでは差がないのですが、コンストラクタA(int arg)を使うとなると話は別です
コンストラクタにはパラメータがあり、何らかの方法で渡す必要があります。
つまり、パラメータがないところまでは、その違いは重要ではありません。 しかし、コンストラクタA(int arg)がある場合は、話は別です
目的によって使い分けるのが正解でしょう
最初の変形では、クラスBの 2つのコンストラクタを 使いたいときに、両方のコンストラクタで重複したコードを受け取ってしまい、それらを削除したところ、最初の変形にあったコードの一部しか得られず、どこでそれを見たのか、なぜそのように書いたのかという疑問が生じてしまいました )))
オブジェクト a1 と a2 のコンストラクタを強制的に使用させることができるのはなぜか?
正しい処理名は「強制的にコンストラクタを呼び出すa1、a2」ではなく、クラス(非静的)フィールドの初期化です。
の場合、義務付け。
どなたか、このフィールドの初期化がどのように良いのか説明していただけませんか?
はこれよりマシです。
そして、そもそも何が言いたいのか?