MQL5'te OOP hakkında sorular - sayfa 79

 
Vladimir Simakov :

Bu durumda hiç de pahalı değil. Pahalı (erişirken bir başvuru için) sanal yöntemlere çağrılar.

kodun çizilmeye zamanı yoktu, işte yöntem:

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 );
}

Bunu şöyle yazabilirim (aramanın sonuçları bire birdir - yani her şeyi doğru yaptım):

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 );
}

şöyle sesleniyorum:

JSONObject *jobj = getJSONObject(getStateIni());

onlar. Seçenek 1 ve 2 hız açısından aynı mı olacak? .... elbette, if () içindeki dizenin uzunluğu kafa karıştırır ... okunması zor, belki de alışkanlıktan kaynaklanan kod

 
Igor Makanu :

kodun çizilmeye zamanı yoktu, işte yöntem:

Bunu şöyle yazabilirim (aramanın sonuçları bire birdir - yani her şeyi doğru yaptım):

şöyle sesleniyorum:

onlar. Seçenek 1 ve 2 hız açısından aynı mı olacak? .... elbette, if () içindeki dizenin uzunluğu kafa karıştırır ... okunması zor, belki de alışkanlıktan kaynaklanan kod

Derleyici tarafından optimizasyon yapılmadan bire bir ise, ikincisi daha hızlıdır. Jo işaretçisi oluşturulmadı veya başlatılmadı.

not.

(JSONObject *)jv

gereksiz. sadece jv'yi döndür

UPD: Yani kısaca?
 if (jv!= NULL && jv.isObject() && jv.getInt( "ActorType" ) == (int)ActorType)
 
Vladimir Simakov :

UPD: Yani kısaca?

JSONValue *jv, getInt() , getDouble() yöntemlerini içermez - bir hata olacaktır, JSONObject türü gereklidir - veya bu türe yayın yapılır

'getInt' - aşırı yüklerden hiçbiri işlev çağrısına uygulanamaz

Enum'u int'ye çevirmek istemiyorum - yorum yazamayacak kadar tembelim, o zaman neyi neyle karşılaştırdığımı anlayamıyorum ve numaralandırma sadece gözlerinizle okuyabildiğiniz için ilginç

Teşekkür ederim!

 
Igor Makanu :

JSONValue *jv, getInt() , getDouble() yöntemlerini içermez - bir hata olacaktır, JSONObject türü gereklidir - veya bu türe yayın yapılır

'getInt' - aşırı yüklerden hiçbiri işlev çağrısına uygulanamaz

Enum'u int'ye çevirmek istemiyorum - yorum yazamayacak kadar tembelim, o zaman neyi neyle karşılaştırdığımı anlayamıyorum ve numaralandırma sadece gözlerinizle okuyabildiğiniz için ilginç

Teşekkür ederim!

JSONValue:public JSONObject'e sahip değil misiniz?
 
Vladimir Simakov :
JSONValue:public JSONObject'e sahip değil misiniz?

böyle çalışmıyor

github'dan kütüphane, işte ekli kaynaklar https://www.mql5.com/en/forum/85652/page72#comment_16758982

KB'de erken sürüm (indirilmemesi için) https://www.mql5.com/en/code/11134 - ayrıca bir kullanım örneği var

 
Igor Makanu :

böyle çalışmıyor

github'dan kütüphane, işte ekli kaynaklar https://www.mql5.com/en/forum/85652/page72#comment_16758982

KB'de erken sürüm (indirilmemesi için) https://www.mql5.com/en/code/11134 - ayrıca bir kullanım örneği var

Mdyaya... Burada UB var. Mirasçıya atama yapamazsınız, ancak mirasçıya bir işaretçi oluşturarak ve ona doğru işaretçinin değerini atayarak bunu bir nevi aşmış olursunuz. Her şey yolunda ama bir an önce
parser.parse(json)

JSONObject* değil dönecek, her şey çalışma zamanında düşecek)))

Ve haklı olarak))) ASLA doğrudan tabandan halefine yayın yapamazsınız - bu UB'dir ( TANIMLANMAMIŞ DAVRANIŞ ), bunu profesyonellerde yaptığınızda hiçbir şey düşmez, ama ... (olasılıkla ilgili bir şaka var Tanrı kralı korusun iken infaz)))))

Doğru şekilde:

JSONObject* jv = dynamic_cast <JSONObject*>(parser.parse(json));
if (jv != NULL && jv.getInt( "ActorType" ) == ActorType) return jv;

Ve size dynamic_cast'in maliyetini anlatmaya başlayan ilk kişi - bir soruyla öldürün, çalışma zamanı, oyuncu kadrosunun yanlış olduğunu nasıl biliyor?

 
Vladimir Simakov :
1) Mdyaya... Burada UB'niz var. Mirasçıya atama yapamazsınız, ancak mirasçıya bir işaretçi oluşturarak ve ona doğru işaretçinin değerini atayarak bunu bir nevi aşmış olursunuz.
Her şey yolunda, ancak JSONObject olmayan bir * döndürdüğü anda her şey çalışma zamanında düşecek)))

Ve haklı olarak))) ASLA doğrudan tabandan halefine yayın yapamazsınız - bu UB'dir ( TANIMLANMAMIŞ DAVRANIŞ ), bunu profesyonellerde yaptığınızda hiçbir şey düşmez, ama ... (olasılıkla ilgili bir şaka var Tanrı kralı korusun iken idam)))))

2) Doğru: Ve size dynamic_cast'in maliyetini anlatmaya başlayan ilk kişi - bir soruyla öldürün, çalışma zamanı, oyuncu kadrosunun yanlış olduğunu nasıl biliyor?

1) UB yoktur ve nesnenin gerçek türü, kullanmadığınız jv.isObject() yöntemiyle kontrol edildiğinden, JSONObject* olmayan bir döndürüldüğünde bile hiçbir şey düşmez.
2) Kitaplığın bir sonraki sürümünde temel sınıf olarak JSONObject kullanan yeni bir veri türü görünürse, sizin örneğiniz çalışmayabilir.

 
Sergey Dzyublik :

1) UB yoktur ve nesnenin gerçek türü, kullanmadığınız jv.isObject() yöntemiyle kontrol edildiğinden, JSONObject* olmayan bir döndürüldüğünde bile hiçbir şey düşmez.
2) Kitaplığın bir sonraki sürümünde temel sınıf olarak JSONObject kullanan yeni bir veri türü görünürse, sizin örneğiniz çalışmayabilir.

 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 );
}

Vurgulanan. Yalnızca sonraki satırda kontrol et))) Örnekte, yaratıcısı ya, tam tersi, önce kontrol et, sonra yayınla)

UPD: dynamic_cast her iki yönde de çalışır)

UPD2: JSONObject'in halefi varsa neden düşsün?

 
Vladimir Simakov :
Mdyaya... Burada UB var.
UB yoktur, mql cast, dynamic_cast'i de içerir. yanlış bir işaretçi durumunda sadece her şey düşecek.
 
Andrei Trukhanovich :
UB yoktur, mql cast, dynamic_cast'i de içerir. yanlış bir işaretçi durumunda sadece her şey düşecek.

Katılıyorum)) Bu artı benim)))