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

 

これはバグですか、それとも何か見逃していますか? 通常のパラボリックEAは、スプレッドを考慮した買いの場合、前のポイントにストップオーダーを出します。
そして今、価格(Ask)は注文価格57781に達したが、注文は開かれていない。

 
実行することの間違いとは
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 

このようにすれば

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS2 Object;
  CLASS1* Ptr = dynamic_cast<CLASS1*>(&Object);
  
  Ptr.i = 1;
}

言語構造に大きな変化があり、派生した型は間違いなく祖先の型ではありません。

C++で確認しました。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1* Object = new CLASS1();
  CLASS2* Ptr = (CLASS2 *)&Object;
  
  Ptr->i = 1;
}

親クラスから派生クラスへのオブジェクトのキャストは正しく処理されます。つまり、そのように設計されていない限り、MQL5の型キャストに関するメカニズムにエラーがあります。

 
fxsaber:
実行エラーは 何ですか

dynamic_castが何を返すか確認しないと、使う意味がない。

 
Konstantin:

とすると

言語構造に非常に大きな変化が起こり、派生した型が祖先の型でないことが明確になったのです。

MQLでは、parental castingはdynamic_castなしでも常に動作しています - 古典的に。もしかしたら、dynamic_castの意味を理解していないのかもしれません。ドキュメントにある例の意味が、おそらく理解できないのです。誰か説明してください。
 
Koldun Zloy:

dynamic_castが何を返すか確認しなければ、使う意味がない。

ありがとうございます。私の例では、NULLを返します。なぜ、このようなことが起こるのでしょうか。

このトリックを使った実用例を教えてください。


開発者は以下のようにGraphic.mqhの中だけで使用します。

      curve=dynamic_cast<CCurve*>(m_arr_curves.At(i));

      if(CheckPointer(curve)!=POINTER_DYNAMIC)
         return(false);

同時に、次のようなクラスやオブジェクトの定義もある。

class CCurve : public CObject

CObject          *At(const int index) const;

つまり、親ポインタを子ポインタに渡すのである。まあ、私の例で言えば、まさにその通りなんですけどねどこに引っ掛かりがあるのか?

 

親クラスへのポインタは、実際には子孫クラスへのポインタを含むことができます。

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

Class2* b = dynamic_cast< Class2* >( a );

// b != NULL
 
Koldun Zloy:

親クラスへのポインタは、実際には子孫クラスへのポインタを含むことができます。

ありがとうございます、了解です
 
fxsaber:
ありがとうございます。

MQLではポインターを子孫クラスのポインター型にキャストできないのに、C++では可能な理由がまだ理解できません。MQLのバグなのか、そうあるべきなのか、説明してください。

 
Konstantin:

はC++で可能なのか、MQLのバグなのか、そうあるべきなのか、説明してください。

C++では、ベースクラスへのポインタが子孫を指す場合のみ可能です。