エラー、バグ、質問 - ページ 1890 1...188318841885188618871888188918901891189218931894189518961897...3185 新しいコメント Renat Fatkhullin 2017.05.13 15:07 #18891 fxsaber:実行エラーは 何ですかそうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。C++とは比較になりません。そこでは何でもかんでも還元できるのです。 Konstantin 2017.05.13 15:09 #18892 Комбинатор: また、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のバグで、修正されるのか、それともこのままなのか、疑問が残ります。 Konstantin 2017.05.13 15:10 #18893 Renat Fatkhullin:そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。C++とは比較になりません。そこでは何でもかんでも還元できるのです。 今、わかりました、明確な説明ありがとうございます )) TheXpert 2017.05.13 15:12 #18894 Konstantin:どういう意味かわからないけど、このコード。 まあ、理解してみてください。まずはプラスでdynamic_castを動作させることから始めましょう。自分で考えれば、もっといいことがあるはずです。 TheXpert 2017.05.13 15:17 #18895 Renat Fatkhullin:そうなんです、下から上への運転はできず、上から下への運転しかできないんです。 ベースクラスから子孫にキャストされないってどういうこと? Renat Fatkhullin 2017.05.13 15:19 #18896 Комбинатор: ベースクラスから子孫へのキャストができないってこと?はい、ベースクラスが実際に構築された子孫クラスを持っていない場合に備えています。 Konstantin 2017.05.13 15:19 #18897 Renat Fatkhullin:そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。 ポインタを上から下へ、つまり親へ持っていき、そのポインタをスコープ内のどこかへ渡した場合、子孫のフィールドはそこで利用できるのでしょうか? TheXpert 2017.05.13 15:19 #18898 Renat Fatkhullin:はい。 レナートさん、dynamic_castって知ってますか? Renat Fatkhullin 2017.05.13 15:21 #18899 Комбинатор: Renatさん、dynamic_castって知ってますか?もちろんです。 MQL5のコードの一部をご覧ください。ベースとなるインスタンスが作成され、その後、セキュリティに違反してダイナミックキャストで子孫に変換しようとする勇ましいものです。まあ、もちろん残念なことではあるのですが。 Renat Fatkhullin 2017.05.13 15:24 #18900 同じ例をドキュメントで直接取り上げて解説しています。実行時のダイナミックキャストは、セキュリティシステムと変換の許容性が確認された後に起動されます。すべての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);// この行は実行 されません } Errors, bugs, questions 型キャスト 構造体、クラス、インターフェイス 1...188318841885188618871888188918901891189218931894189518961897...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
実行エラーは 何ですか
そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。
C++とは比較になりません。そこでは何でもかんでも還元できるのです。
また、C++では、ベースクラスへのポインタがその子孫を指す場合のみ動作します。
どういう意味かわからないけど、このコード。
そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。
C++とは比較になりません。そこでは何でもかんでも還元できるのです。
今、わかりました、明確な説明ありがとうございます ))
どういう意味かわからないけど、このコード。
そうなんです、下から上への運転はできず、上から下への運転しかできないんです。
ベースクラスから子孫へのキャストができないってこと?
はい、ベースクラスが実際に構築された子孫クラスを持っていない場合に備えています。
そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。
はい。
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);// この行は実行 されません
}