MQL5におけるOOPに関する質問 - ページ 79

 
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()の文字列の長さには戸惑いますが・・・。コードが読み にくい、慣れのせいかもしれないが

 
Igor Makanu:

コードを掻い摘む時間が無かったので、ここに方法を示します。

このように書くことができます(通話結果は1対1、つまり、すべて正しく行ったことになります)。

私はこのように呼んでいます。

つまり、バリアント1とバリアント2は同じ速度になるのでしょうか?もちろん、if()の文字列の長さには戸惑いますが・・・。...コードが読み にくいのは、実体験からかもしれません。

コンパイラによる最適化なしで全く同じであれば、後者の方が速い。jo-pointerが作成されず、初期化されない。

PS.

(JSONObject *)jv

は不要です。jvを返すだけ

UPD:もっと短いかな?
if (jv!=NULL && jv.isObject() && jv.getInt("ActorType") == (int)ActorType)
 
Vladimir Simakov:

UPD:もっと短いですか?

JSONValue *jvはgetInt()、getDouble()メソッドを含まない - エラーになる、JSONObjectタイプが必要 - またはそのタイプへの導線が必要

'getInt' -関数 呼び出しに適用できるオーバーロードは1つもありません。

コメントを書くのが面倒だし、比較した内容が後でわからなくなるし、enumは目で見てわかるから面白いだけだし。

ありがとうございました。

 
Igor Makanu:

JSONValue *jv は getInt() , getDouble() メソッドを含まない - エラーが発生します、JSONObject タイプが必要です - またはそのタイプにつながる

'getInt' -関数 呼び出しに適用できるオーバーロードは1つもありません。

コメントを書くのが面倒だし、比較した内容が後でわからなくなるし、enumは目で見てわかるから面白いだけだし。

ありがとうございました。

JSONValue:public JSONObjectはないのですか?
 
Vladimir Simakov:
JSONValue:public JSONObjectはないのですか?

こうはいかない

ライブラリはgithabから入手しました。ソースコードはこちらですhttps://www.mql5.com/ru/forum/85652/page72#comment_16758982

初期バージョン(ダウンロードしないように)KBhttps://www.mql5.com/en/code/11134- 使い方の例もあります。

 
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のコストについて話し始めた人は、「ランタイムはキャストが間違っていることをどうやって知るのか」という質問に釘を刺します。

 
Vladimir Simakov:
1) うん...ここにUBがありますね。継承者へのキャストはできませんが、継承者へのポインタを作成し、正しいポインタの値を代入することで、なんとなく回避できたのではないでしょうか。
大丈夫ですが、JSONObject*以外を返した途端、全てがランタイムに陥ります)))

そして、あなたはそれに値する))))ベースから相続人への直接キャストはUB(UNDEFINED BEHAVIOR)で、プラスでそれをやると何も落ちないが(God save the king

2 で実行される可能性があるというジョークがあります) 右:そして、最初に dynamic_cast のコストについて話し始めた人 - 質問で彼を釘付けにします、ランタイムはどうやってキャストが間違っていることを知るのでしょうか?

1) JSONObject*でないものが返されても、UBはなく、何も落ちない。なぜなら、本当のオブジェクトの型は、jv.isObject() メソッドでチェックされるので、まさにあなたが使っていないものだからです。
2)JSONObjectを 基本クラスとする新しいデータ型 がライブラリの次のバージョンで導入された場合、あなたの例は実行不可能になる可能性があることです。

 
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に 継承者がいる場合、なぜそれがドロップする必要があるのか?

 
Vladimir Simakov:
ああ...ここにUBがありますね。
UBはありません。mqlのキャストはdynamic_castも含んでいます。
 
Andrei Trukhanovich:
UBはありません。mqlのキャストはdynamic_castも含んでいます。

そうですね)))それはプラス側の私です))