エラー、バグ、質問 - ページ 2358 1...235123522353235423552356235723582359236023612362236323642365...3185 新しいコメント Alexey Navoykov 2018.12.24 15:10 #23571 Ilya Malev: ただし、そのオブジェクトに仮想メソッドがなかったとしても、アクセスする際にはポインタの有効性をチェックする必要があります。実はこれ、曖昧な質問なんです。例えば、このチェックはC#では常に行われ、C++では必要な場合のみ行われるため、速度面で有利になる。 結局のところ、オブジェクトのフィールドにアクセスしないメソッドを呼び出すと、ポインタをチェックする意味がなくなってしまいます。 要するに、そのようなメソッドは静的なものと同等なのです。 Ilya Malev 2018.12.24 15:14 #23572 Alexey Navoykov:一般的に、これは曖昧な問題です。例えば、C#ではこのようなチェックを常に行っていますが、C++では必要な時だけ行っているため、スピード面で有利です。 なぜなら、オブジェクトのフィールドを参照しないメソッドを呼び出す場合、ポインタをチェックする意味がないからです。 実際、そのようなメソッドは静的メソッドと同等です。オブジェクトはデータを全く持たないかもしれませんが、全く異なる、決定的に重要な動作を実装することができます。例えば、特別な型依存の方法で外部データを参照したり、特別な動作を全く行わないこともできます。データがない状態で静的な(つまり100%仮想ではない)メソッドと等価である」というようなアプローチをどう正当化するのか、よくわからないのです。 つまり、少なくともポインタオブジェクトは常に1つのフィールドを持つ、それが型である。これによって、呼び出されているメソッドのアドレスを知ることができる。そうでなければ、なぜOOPが必要なのでしょうか? 追伸:自動オブジェクトについては、個人的には少なくとも動作のロジックについては反対しませんが(ほとんど使わないので)、ポインタに割り当てるのはやめておいた方がいいでしょう。 Ilyas 2018.12.24 15:17 #23573 残念ながら、私は皆さんに誤解を与えてしまいました。 B *b=a; B b=a; の場合、コピーコンストラクタの代わりにコピーオペレータが呼び出されます。 2番目のケースでは、B()コンストラクタが呼び出された後 いずれにせよ、まずは分析し、それから修正する。 pavlick_ 2018.12.24 15:26 #23574 あ、µl には自動生成のコピーコンストラクタがあることが判明(obj(other_obj) をクラス分けできず、= でしかできないので、全く存在しないと思ってました)。でも、なぜか生成されないんですよね、もし。 class Q { public: Q(Q&)=default; // нельзя Q(int) {} // из-за него копирующий конструктор исчез }; Ilyas 2018.12.24 15:29 #23575 pavlick_:あ、µl には自動生成のコピーコンストラクタがあることが判明(obj(other_obj) をクラス分けできず、= でしかできないので、全く存在しないと思ってました)。でも、なぜか生成されないんですよね、もし。 default と delete はサポートされていません。デフォルトのコピーコンストラクタは、ここまでで終了していることが判明しました。 コピー演算子のみ、つまりコンストラクトの場合。 CFoo foo=another_foo; デフォルトのCFooコンストラクタが最初に呼ばれ、次にコピー演算子 Alexey Navoykov 2018.12.24 15:30 #23576 Ilyas:の場合、コピーコンストラクタではなく、コピー演算子が呼び出されます。 しかし、これはまだ間違いです。暗黙のコピー演算子はクラスBに対してのみ作られるべきで、すべての親クラスに対して作られるべきではありません。つまり、オブジェクトはその内部を部分的に置き換えることを許されるべきではありません。 pavlick_ 2018.12.24 15:31 #23577 Ilyas:default と delete はサポートされていません。確かにそうですが、コピーコンストラクタの生成をオーバーライドするのは、カスタムコピーコンストラクタが あるときだけですよね?どんなカスタムでもない。 A100 2018.12.24 15:42 #23578 Alexey Navoykov: すなわち、オブジェクトはその内部を部分的に交換することはできないはずです。これは、ある種の人工的な自己限定なのでは...。視野が狭いとさえ言えるでしょう。 class A {}; class B : public A { public: void operator =( const A& ) {} }; 何が問題なのか? そんなデザインを自分の中に見つけてしまった...。そして、それが機能する...をご覧ください。だから、開発者はこのままにしておいたほうがいいと思うのですが......。少なくとも、対応する演算子やコンストラクタが明示的に定義されている場合は Alexey Navoykov 2018.12.24 15:53 #23579 A100:これは、ある種の人工的な自己限定なのでは...。視野が狭いとさえ言えるでしょう。 何が問題なのか? 私のところにもこんな建造物が...。そして、すべてがうまくいく...をご覧ください。だから、開発者はこのままにしておいた方がいいと思うのですが...。少なくとも、関連する演算子が明示的に定義されている場合はまずは、C++でどのように動作するのかを確認してください。どうやらそのルールは、「心の狭い」人たちが考案したものらしい。 そして、間違った言語のアーキテクチャから身を守るために、その都度プラグに変身する......。いや、最初からそうするべきだ。 つまり、言語 A100 2018.12.24 16:05 #23580 Alexey Navoykov:まずはC++でどう動くかを確認する。どうやらそのルールは、「心の狭い」人たちが考案したものらしい。 しかし、間違った言語アーキテクチャから身を守るために、毎回プラグインを作るのは......。いや、最初からそうしてください。 言葉のことです。https://www.mql5.com/ru/forum/1111/page2358#comment_10003995 を考慮し、特に再確認しました。 #ifdef __cplusplus #include "https://www.mql5.com/ru/forum/1111/page2358#comment_10003995" void OnStart() { A a; B b; b = a; } #endif It's okay DJ Ошибки, баги, вопросы 2018.12.24www.mql5.com Общее обсуждение: Ошибки, баги, вопросы 1...235123522353235423552356235723582359236023612362236323642365...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ただし、そのオブジェクトに仮想メソッドがなかったとしても、アクセスする際にはポインタの有効性をチェックする必要があります。
実はこれ、曖昧な質問なんです。例えば、このチェックはC#では常に行われ、C++では必要な場合のみ行われるため、速度面で有利になる。
結局のところ、オブジェクトのフィールドにアクセスしないメソッドを呼び出すと、ポインタをチェックする意味がなくなってしまいます。 要するに、そのようなメソッドは静的なものと同等なのです。
一般的に、これは曖昧な問題です。例えば、C#ではこのようなチェックを常に行っていますが、C++では必要な時だけ行っているため、スピード面で有利です。
なぜなら、オブジェクトのフィールドを参照しないメソッドを呼び出す場合、ポインタをチェックする意味がないからです。 実際、そのようなメソッドは静的メソッドと同等です。
オブジェクトはデータを全く持たないかもしれませんが、全く異なる、決定的に重要な動作を実装することができます。例えば、特別な型依存の方法で外部データを参照したり、特別な動作を全く行わないこともできます。データがない状態で静的な(つまり100%仮想ではない)メソッドと等価である」というようなアプローチをどう正当化するのか、よくわからないのです。
つまり、少なくともポインタオブジェクトは常に1つのフィールドを持つ、それが型である。これによって、呼び出されているメソッドのアドレスを知ることができる。そうでなければ、なぜOOPが必要なのでしょうか?
追伸:自動オブジェクトについては、個人的には少なくとも動作のロジックについては反対しませんが(ほとんど使わないので)、ポインタに割り当てるのはやめておいた方がいいでしょう。残念ながら、私は皆さんに誤解を与えてしまいました。
の場合、コピーコンストラクタの代わりにコピーオペレータが呼び出されます。
2番目のケースでは、B()コンストラクタが呼び出された後
いずれにせよ、まずは分析し、それから修正する。
あ、µl には自動生成のコピーコンストラクタがあることが判明(obj(other_obj) をクラス分けできず、= でしかできないので、全く存在しないと思ってました)。でも、なぜか生成されないんですよね、もし。
あ、µl には自動生成のコピーコンストラクタがあることが判明(obj(other_obj) をクラス分けできず、= でしかできないので、全く存在しないと思ってました)。でも、なぜか生成されないんですよね、もし。
default と delete はサポートされていません。
デフォルトのコピーコンストラクタは、ここまでで終了していることが判明しました。
コピー演算子のみ、つまりコンストラクトの場合。
デフォルトのCFooコンストラクタが最初に呼ばれ、次にコピー演算子
の場合、コピーコンストラクタではなく、コピー演算子が呼び出されます。
default と delete はサポートされていません。
確かにそうですが、コピーコンストラクタの生成をオーバーライドするのは、カスタムコピーコンストラクタが あるときだけですよね?どんなカスタムでもない。
すなわち、オブジェクトはその内部を部分的に交換することはできないはずです。
これは、ある種の人工的な自己限定なのでは...。視野が狭いとさえ言えるでしょう。
何が問題なのか?
そんなデザインを自分の中に見つけてしまった...。そして、それが機能する...をご覧ください。だから、開発者はこのままにしておいたほうがいいと思うのですが......。少なくとも、対応する演算子やコンストラクタが明示的に定義されている場合は
これは、ある種の人工的な自己限定なのでは...。視野が狭いとさえ言えるでしょう。
何が問題なのか?
私のところにもこんな建造物が...。そして、すべてがうまくいく...をご覧ください。だから、開発者はこのままにしておいた方がいいと思うのですが...。少なくとも、関連する演算子が明示的に定義されている場合は
まずは、C++でどのように動作するのかを確認してください。どうやらそのルールは、「心の狭い」人たちが考案したものらしい。
そして、間違った言語のアーキテクチャから身を守るために、その都度プラグに変身する......。いや、最初からそうするべきだ。 つまり、言語
まずはC++でどう動くかを確認する。どうやらそのルールは、「心の狭い」人たちが考案したものらしい。
しかし、間違った言語アーキテクチャから身を守るために、毎回プラグインを作るのは......。いや、最初からそうしてください。 言葉のことです。
https://www.mql5.com/ru/forum/1111/page2358#comment_10003995 を考慮し、特に再確認しました。
It's okay DJ