MQL5におけるOOPに関する質問 - ページ 79 1...727374757677787980818283848586...96 新しいコメント Igor Makanu 2020.06.11 14:05 #781 Vladimir Simakov:この場合、コストはかからない。仮想メソッドを呼び出すには(デリファレンス・デリファレンスあたり)コストがかかる。 コードを掻い摘む時間がなかったので、ここにメソッドを紹介します。 JSONObject * CActor::getJSONObject(const string json)const { JSONParser parser; JSONValue *jv; JSONObject *jo = jv = parser.parse(json); if (jv != NULL && jv.isObject() && (EACTOR_TYPE)jo.getInt("ActorType") == ActorType) return(jo); Print(__FUNCTION__ + "parser error, json = ",json); delete jv; delete jo; return(NULL); } このように書くことができます(通話結果は1対1、つまり、すべて正しく行ったことになります)。 JSONObject * CActor::getJSONObject(const string json)const { JSONParser parser; JSONValue *jv = parser.parse(json); //JSONObject *jo = jv = parser.parse(json); if (jv != NULL && jv.isObject() && (EACTOR_TYPE)(((JSONObject *)jv).getInt("ActorType")) == ActorType) return((JSONObject *)jv); Print(__FUNCTION__ + "parser error, json = ",json); delete jv; return(NULL); } 私はこのように呼んでいます。 JSONObject *jobj = getJSONObject(getStateIni()); つまり、バリアント1とバリアント2は同じ速度になるのでしょうか?もちろん、if()の文字列の長さには戸惑いますが・・・。コードが読み にくい、慣れのせいかもしれないが Vladimir Simakov 2020.06.11 14:19 #782 Igor Makanu:コードを掻い摘む時間が無かったので、ここに方法を示します。このように書くことができます(通話結果は1対1、つまり、すべて正しく行ったことになります)。私はこのように呼んでいます。つまり、バリアント1とバリアント2は同じ速度になるのでしょうか?もちろん、if()の文字列の長さには戸惑いますが・・・。...コードが読み にくいのは、実体験からかもしれません。コンパイラによる最適化なしで全く同じであれば、後者の方が速い。jo-pointerが作成されず、初期化されない。PS.(JSONObject *)jvは不要です。jvを返すだけ UPD:もっと短いかな? if (jv!=NULL && jv.isObject() && jv.getInt("ActorType") == (int)ActorType) Igor Makanu 2020.06.11 14:49 #783 Vladimir Simakov:UPD:もっと短いですか? JSONValue *jvはgetInt()、getDouble()メソッドを含まない - エラーになる、JSONObjectタイプが必要 - またはそのタイプへの導線が必要 'getInt' -関数 呼び出しに適用できるオーバーロードは1つもありません。 コメントを書くのが面倒だし、比較した内容が後でわからなくなるし、enumは目で見てわかるから面白いだけだし。 ありがとうございました。 Vladimir Simakov 2020.06.11 15:10 #784 Igor Makanu:JSONValue *jv は getInt() , getDouble() メソッドを含まない - エラーが発生します、JSONObject タイプが必要です - またはそのタイプにつながる 'getInt' -関数 呼び出しに適用できるオーバーロードは1つもありません。 コメントを書くのが面倒だし、比較した内容が後でわからなくなるし、enumは目で見てわかるから面白いだけだし。ありがとうございました。 JSONValue:public JSONObjectはないのですか? Igor Makanu 2020.06.11 16:33 #785 Vladimir Simakov: JSONValue:public JSONObjectはないのですか? こうはいかない ライブラリはgithabから入手しました。ソースコードはこちらですhttps://www.mql5.com/ru/forum/85652/page72#comment_16758982 初期バージョン(ダウンロードしないように)KBhttps://www.mql5.com/en/code/11134- 使い方の例もあります。 Vladimir Simakov 2020.06.11 18:13 #786 Igor Makanu:こうはいかないライブラリはgithabから入手しました。ソースコードはこちらですhttps://www.mql5.com/ru/forum/85652/page72#comment_16758982初期バージョン(ダウンロードしないように)KBhttps://www.mql5.com/en/code/11134- 使用例もあり ああ...ここにUBがありますね。継承者へのキャストはできませんが、継承者へのポインタを作成し、正しいポインタの値を代入することで、なんとなく回避できたのではないでしょうか。それはいいのですが、 parser.parse(json) となるとすぐに ではJSONObject*を返さないので、全てランタイムに落ちます))))よかったね)))UB (UNDEFINED BEHAVIOR) で、プラスでそれを行うと、何もドロップしませんが......。(ついでに処刑できるというジョークもある)))そうですね。JSONObject* jv = dynamic_cast<JSONObject*>(parser.parse(json)); if (jv != NULL && jv.getInt("ActorType") == ActorType) return jv; そして、最初にdynamic_castのコストについて話し始めた人は、「ランタイムはキャストが間違っていることをどうやって知るのか」という質問に釘を刺します。 Sergey Dzyublik 2020.06.11 18:51 #787 Vladimir Simakov: 1) うん...ここにUBがありますね。継承者へのキャストはできませんが、継承者へのポインタを作成し、正しいポインタの値を代入することで、なんとなく回避できたのではないでしょうか。 大丈夫ですが、JSONObject*以外を返した途端、全てがランタイムに陥ります))) そして、あなたはそれに値する))))ベースから相続人への直接キャストはUB(UNDEFINED BEHAVIOR)で、プラスでそれをやると何も落ちないが(God save the king 2 で実行される可能性があるというジョークがあります) 右:そして、最初に dynamic_cast のコストについて話し始めた人 - 質問で彼を釘付けにします、ランタイムはどうやってキャストが間違っていることを知るのでしょうか? 1) JSONObject*でないものが返されても、UBはなく、何も落ちない。なぜなら、本当のオブジェクトの型は、jv.isObject() メソッドでチェックされるので、まさにあなたが使っていないものだからです。 2)JSONObjectを 基本クラスとする新しいデータ型 がライブラリの次のバージョンで導入された場合、あなたの例は実行不可能になる可能性があることです。 Vladimir Simakov 2020.06.11 18:54 #788 Sergey Dzyublik:1) JSONObject*が返されても、UBはなく、何もクラッシュしない。なぜなら、本当のオブジェクトタイプは、jv.isObject() メソッドによってチェックされるからで、まさにあなたが使っていないものだからです。 2)JSONObjectを 基本クラスとする新しいデータ型 がライブラリの次のバージョンで導入された場合、あなたの例は実行不可能になる可能性があることです。 JSONObject * CActor::getJSONObject(const string json)const { JSONParser parser; JSONValue *jv; JSONObject *jo = jv = parser.parse(json); if (jv != NULL && jv.isObject() && (EACTOR_TYPE)jo.getInt("ActorType") == ActorType) return(jo); Print(__FUNCTION__ + "parser error, json = ",json); delete jv; delete jo; return(NULL); }ハイライト次の行だけチェックする))lib作成者の例では、ちょうどその逆で、まずチェックし、次にキャストする)UPD: dynamic_cast は両方の方法で動作します)UPD2:JSONObjectに 継承者がいる場合、なぜそれがドロップする必要があるのか? Andrei Trukhanovich 2020.06.11 19:00 #789 Vladimir Simakov: ああ...ここにUBがありますね。 UBはありません。mqlのキャストはdynamic_castも含んでいます。 Vladimir Simakov 2020.06.11 19:02 #790 Andrei Trukhanovich: UBはありません。mqlのキャストはdynamic_castも含んでいます。 そうですね)))それはプラス側の私です)) 1...727374757677787980818283848586...96 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
この場合、コストはかからない。仮想メソッドを呼び出すには(デリファレンス・デリファレンスあたり)コストがかかる。
コードを掻い摘む時間がなかったので、ここにメソッドを紹介します。
このように書くことができます(通話結果は1対1、つまり、すべて正しく行ったことになります)。
私はこのように呼んでいます。
つまり、バリアント1とバリアント2は同じ速度になるのでしょうか?もちろん、if()の文字列の長さには戸惑いますが・・・。コードが読み にくい、慣れのせいかもしれないが
コードを掻い摘む時間が無かったので、ここに方法を示します。
このように書くことができます(通話結果は1対1、つまり、すべて正しく行ったことになります)。
私はこのように呼んでいます。
つまり、バリアント1とバリアント2は同じ速度になるのでしょうか?もちろん、if()の文字列の長さには戸惑いますが・・・。...コードが読み にくいのは、実体験からかもしれません。
コンパイラによる最適化なしで全く同じであれば、後者の方が速い。jo-pointerが作成されず、初期化されない。
PS.
は不要です。jvを返すだけ
UPD:もっと短いかな?UPD:もっと短いですか?
JSONValue *jvはgetInt()、getDouble()メソッドを含まない - エラーになる、JSONObjectタイプが必要 - またはそのタイプへの導線が必要
'getInt' -関数 呼び出しに適用できるオーバーロードは1つもありません。
コメントを書くのが面倒だし、比較した内容が後でわからなくなるし、enumは目で見てわかるから面白いだけだし。
ありがとうございました。
JSONValue *jv は getInt() , getDouble() メソッドを含まない - エラーが発生します、JSONObject タイプが必要です - またはそのタイプにつながる
'getInt' -関数 呼び出しに適用できるオーバーロードは1つもありません。
コメントを書くのが面倒だし、比較した内容が後でわからなくなるし、enumは目で見てわかるから面白いだけだし。
ありがとうございました。
JSONValue:public JSONObjectはないのですか?
こうはいかない
ライブラリはgithabから入手しました。ソースコードはこちらですhttps://www.mql5.com/ru/forum/85652/page72#comment_16758982
初期バージョン(ダウンロードしないように)KBhttps://www.mql5.com/en/code/11134- 使い方の例もあります。
こうはいかない
ライブラリはgithabから入手しました。ソースコードはこちらですhttps://www.mql5.com/ru/forum/85652/page72#comment_16758982
初期バージョン(ダウンロードしないように)KBhttps://www.mql5.com/en/code/11134- 使用例もあり
となるとすぐに
ではJSONObject*を返さないので、全てランタイムに落ちます))))
よかったね)))UB (UNDEFINED BEHAVIOR) で、プラスでそれを行うと、何もドロップしませんが......。(ついでに処刑できるというジョークもある)))
そうですね。
そして、最初にdynamic_castのコストについて話し始めた人は、「ランタイムはキャストが間違っていることをどうやって知るのか」という質問に釘を刺します。
1) うん...ここにUBがありますね。継承者へのキャストはできませんが、継承者へのポインタを作成し、正しいポインタの値を代入することで、なんとなく回避できたのではないでしょうか。
大丈夫ですが、JSONObject*以外を返した途端、全てがランタイムに陥ります)))
そして、あなたはそれに値する))))ベースから相続人への直接キャストはUB(UNDEFINED BEHAVIOR)で、プラスでそれをやると何も落ちないが(God save the king
2 で実行される可能性があるというジョークがあります) 右:そして、最初に dynamic_cast のコストについて話し始めた人 - 質問で彼を釘付けにします、ランタイムはどうやってキャストが間違っていることを知るのでしょうか?
1) JSONObject*でないものが返されても、UBはなく、何も落ちない。なぜなら、本当のオブジェクトの型は、jv.isObject() メソッドでチェックされるので、まさにあなたが使っていないものだからです。
2)JSONObjectを 基本クラスとする新しいデータ型 がライブラリの次のバージョンで導入された場合、あなたの例は実行不可能になる可能性があることです。
1) JSONObject*が返されても、UBはなく、何もクラッシュしない。なぜなら、本当のオブジェクトタイプは、jv.isObject() メソッドによってチェックされるからで、まさにあなたが使っていないものだからです。
2)JSONObjectを 基本クラスとする新しいデータ型 がライブラリの次のバージョンで導入された場合、あなたの例は実行不可能になる可能性があることです。
ハイライト次の行だけチェックする))lib作成者の例では、ちょうどその逆で、まずチェックし、次にキャストする)
UPD: dynamic_cast は両方の方法で動作します)
UPD2:JSONObjectに 継承者がいる場合、なぜそれがドロップする必要があるのか?
ああ...ここにUBがありますね。
UBはありません。mqlのキャストはdynamic_castも含んでいます。
そうですね)))それはプラス側の私です))