エラー、バグ、質問 - ページ 2358

 
Ilya Malev:

ただし、そのオブジェクトに仮想メソッドがなかったとしても、アクセスする際にはポインタの有効性をチェックする必要があります。

実はこれ、曖昧な質問なんです。例えば、このチェックはC#では常に行われ、C++では必要な場合のみ行われるため、速度面で有利になる。

結局のところ、オブジェクトのフィールドにアクセスしないメソッドを呼び出すと、ポインタをチェックする意味がなくなってしまいます。 要するに、そのようなメソッドは静的なものと同等なのです。

 
Alexey Navoykov:

一般的に、これは曖昧な問題です。例えば、C#ではこのようなチェックを常に行っていますが、C++では必要な時だけ行っているため、スピード面で有利です。

なぜなら、オブジェクトのフィールドを参照しないメソッドを呼び出す場合、ポインタをチェックする意味がないからです。 実際、そのようなメソッドは静的メソッドと同等です。

オブジェクトはデータを全く持たないかもしれませんが、全く異なる、決定的に重要な動作を実装することができます。例えば、特別な型依存の方法で外部データを参照したり、特別な動作を全く行わないこともできます。データがない状態で静的な(つまり100%仮想ではない)メソッドと等価である」というようなアプローチをどう正当化するのか、よくわからないのです。

つまり、少なくともポインタオブジェクトは常に1つのフィールドを持つ、それが型である。これによって、呼び出されているメソッドのアドレスを知ることができる。そうでなければ、なぜOOPが必要なのでしょうか?

追伸:自動オブジェクトについては、個人的には少なくとも動作のロジックについては反対しませんが(ほとんど使わないので)、ポインタに割り当てるのはやめておいた方がいいでしょう。
 

残念ながら、私は皆さんに誤解を与えてしまいました。

B *b=a;
B b=a;

の場合、コピーコンストラクタの代わりにコピーオペレータが呼び出されます。
2番目のケースでは、B()コンストラクタが呼び出された後

いずれにせよ、まずは分析し、それから修正する。

 

あ、µl には自動生成のコピーコンストラクタがあることが判明(obj(other_obj) をクラス分けできず、= でしかできないので、全く存在しないと思ってました)。でも、なぜか生成されないんですよね、もし。

class Q
{
public:
   Q(Q&)=default;  // нельзя
   Q(int) {}       // из-за него копирующий конструктор исчез
};
 
pavlick_:

あ、µl には自動生成のコピーコンストラクタがあることが判明(obj(other_obj) をクラス分けできず、= でしかできないので、全く存在しないと思ってました)。でも、なぜか生成されないんですよね、もし。

default と delete はサポートされていません。

デフォルトのコピーコンストラクタは、ここまでで終了していることが判明しました。

コピー演算子のみ、つまりコンストラクトの場合。

CFoo foo=another_foo;

デフォルトのCFooコンストラクタが最初に呼ばれ、次にコピー演算子

 
Ilyas:

の場合、コピーコンストラクタではなく、コピー演算子が呼び出されます。

しかし、これはまだ間違いです。暗黙のコピー演算子はクラスBに対してのみ作られるべきで、すべての親クラスに対して作られるべきではありません。つまり、オブジェクトはその内部を部分的に置き換えることを許されるべきではありません。
 
Ilyas:

default と delete はサポートされていません。

確かにそうですが、コピーコンストラクタの生成をオーバーライドするのは、カスタムコピーコンストラクタが あるときだけですよね?どんなカスタムでもない。

 
Alexey Navoykov:
すなわち、オブジェクトはその内部を部分的に交換することはできないはずです。

これは、ある種の人工的な自己限定なのでは...。視野が狭いとさえ言えるでしょう。

class A {};
class B : public A {
public:
        void operator =( const A& ) {}
};

何が問題なのか?

そんなデザインを自分の中に見つけてしまった...。そして、それが機能する...をご覧ください。だから、開発者はこのままにしておいたほうがいいと思うのですが......。少なくとも、対応する演算子やコンストラクタが明示的に定義されている場合は

 
A100:

これは、ある種の人工的な自己限定なのでは...。視野が狭いとさえ言えるでしょう。

何が問題なのか?

私のところにもこんな建造物が...。そして、すべてがうまくいく...をご覧ください。だから、開発者はこのままにしておいた方がいいと思うのですが...。少なくとも、関連する演算子が明示的に定義されている場合は

まずは、C++でどのように動作するのかを確認してください。どうやらそのルールは、「心の狭い」人たちが考案したものらしい。

そして、間違った言語のアーキテクチャから身を守るために、その都度プラグに変身する......。いや、最初からそうするべきだ。 つまり、言語

 
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.24
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы