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

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

そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。

C++とは比較になりません。そこでは何でもかんでも還元できるのです。

 
Комбинатор:
また、C++では、ベースクラスへのポインタがその子孫を指す場合のみ動作します。

どういう意味かわからないけど、このコード。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

int main() {
  CLASS1 _object;
  CLASS2 *_ptr = (CLASS2*)&_object;  
  _ptr->i = 1;

   return 0;
}

がC++で動作するのは、上に書いたとおりです。そして、以下が同じコードです(MQLの構文を考慮)。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

int OnInit() {
  CLASS1 _object;
  CLASS2 *_ptr = dynamic_cast<CLASS2 *>(&_object);
  
  _ptr.i = 1;

   return 0;
}
ptr が NULL を取得するため、動作しなくなりました。
これはMQLのバグで、修正されるのか、それともこのままなのか、疑問が残ります。
 
Renat Fatkhullin:

そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。

C++とは比較になりません。そこでは何でもかんでも還元できるのです。


今、わかりました、明確な説明ありがとうございます ))
 
Konstantin:

どういう意味かわからないけど、このコード。

まあ、理解してみてください。まずはプラスでdynamic_castを動作させることから始めましょう。自分で考えれば、もっといいことがあるはずです。
 
Renat Fatkhullin:

そうなんです、下から上への運転はできず、上から下への運転しかできないんです。

ベースクラスから子孫にキャストされないってどういうこと?
 
Комбинатор:
ベースクラスから子孫へのキャストができないってこと?

はい、ベースクラスが実際に構築された子孫クラスを持っていない場合に備えています。

 
Renat Fatkhullin:

そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。

ポインタを上から下へ、つまり親へ持っていき、そのポインタをスコープ内のどこかへ渡した場合、子孫のフィールドはそこで利用できるのでしょうか?
 
Renat Fatkhullin:

はい。

レナートさん、dynamic_castって知ってますか?
 
Комбинатор:
Renatさん、dynamic_castって知ってますか?

もちろんです。

MQL5のコードの一部をご覧ください。ベースとなるインスタンスが作成され、その後、セキュリティに違反してダイナミックキャストで子孫に変換しようとする勇ましいものです。まあ、もちろん残念なことではあるのですが。

 

同じ例をドキュメントで直接取り上げて解説しています。実行時のダイナミックキャストは、セキュリティシステムと変換の許容性が確認された後に起動されます。すべてのMQL5オブジェクトは、実行時に権限をチェックするためのすべてのメタ情報を持っています。これは空っぽのC++ではありません。


dynamic_cast演算子による動的な型変換

dynamic_cast演算子を使って型を動的にキャストすることが可能ですが、これはクラスポインタにのみ適用できます。この場合、型の正しさのチェックはプログラム実行の瞬間に行われる。これは、dynamic_cast 演算子を使用する際に、コンパイラが変換に使用されるデータ型をチェックしないことを意味します。実際のオブジェクトの型とは異なるデータ型へのポインタの変換が行われた場合、結果は NULL となる。

dynamic_cast<type-id> ( 式 )

角括弧内の type-id パラメータは 以前に定義されたクラスタイプへのポインタでなければ ならない。オペランド型は (C++とは異なり)void以外 であれば何でもよい。

class CBar { };
class CFoo :public CBar { };

voidOnStart()
{
CBarバー
//--- ポインタ型*barからポインタ型*fooへの動的キャストが 可能
CFoo *foo =dynamic_cast<CFoo*>(&bar);//--- 実行時のクリティカルエラーなし
Print(foo);// foo=NULL
//--- Barオブジェクトの参照をFooオブジェクトに明示的にキャスト しようとすることは禁止されています。
foo=(CFoo *)&bar;// 重大な実行エラーが発生 します
Print(foo);// この行は実行 されません
}