Вопросы по ООП в MQL5 - страница 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);
}

могу так записать (результаты вызова один в один - т.е. корректно все сделал):

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 и 2 по скорости будут один в один? .... смущает конечно длина  строки в if() ... трудно читаемый код, возможно с непривычки

Если один в один, без оптимизации компилятором, то второй быстрее. Не создается и не ициализируется указатель jo.

PS.

(JSONObject *)jv

лишнее. Просто return jv

UPD: Так короче?
if (jv!=NULL && jv.isObject() && jv.getInt("ActorType") == (int)ActorType)
 
Vladimir Simakov:

UPD: Так короче?

JSONValue  *jv не содержит методов getInt() , getDouble() - будет ошибка, нужен тип JSONObject - или привести к этому типу

'getInt' - no one of the overloads can be applied to the function call

enum не хочу приводить к int  - комментарии лень писать, потом не разберусь, что с чем сравнивал, а перечисление и  интересно лишь тем, что его читать глазами можно

Спасибо!

 
Igor Makanu:

JSONValue  *jv не содержит методов getInt() , getDouble() - будет ошибка, нужен тип JSONObject - или привести к этому типу

'getInt' - no one of the overloads can be applied to the function call

enum не хочу приводить к int  - комментарии лень писать, потом не разберусь, что с чем сравнивал, а перечисление и  интересно лишь тем, что его читать глазами можно

Спасибо!

У тебя разве не JSONValue:public JSONObject ?
 
Vladimir Simakov:
У тебя разве не JSONValue:public JSONObject ?

не работает так

библиотека с гитхаба, вот исходники приатачивал https://www.mql5.com/ru/forum/85652/page72#comment_16758982

ранняя версия (чтоб не качать) в КБ https://www.mql5.com/en/code/11134   - там же и пример использования

 
Igor Makanu:

не работает так

библиотека с гитхаба, вот исходники приатачивал https://www.mql5.com/ru/forum/85652/page72#comment_16758982

ранняя версия (чтоб не качать) в КБ https://www.mql5.com/en/code/11134   - там же и пример использования

Мдяя... У Вас UB тут. Нельзя кастить к наследнику, но Вы типа обошли это созданием указателя на наследник и присвоения ему значения правильного указателя. Все ничего, но как только
parser.parse(json)

вернет не JSONObject*, все упадет в run-time)))

И поделом))) НИКОГДА нельзя напрямую кастить от базового к наследнику - это UB ( UNDEFINED BEHAVIOR), когда Вы так в плюсах сделаете, ничего падать не будет, но... (есть шутка, про возможность исполнения при этом боже храни короля))))

Правильно:

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

А первого, кто начнет Вам рассказывать про стоимость dynamic_cast - пришибайте вопросом, откуда run-time знает, что каст неправильный?

 
Vladimir Simakov:
1) Мдяя... У Вас UB тут. Нельзя кастить к наследнику, но Вы типа обошли это созданием указателя на наследник и присвоения ему значения правильного указателя.
Все ничего, но как только вернет не JSONObject*, все упадет в run-time)))

И поделом))) НИКОГДА нельзя напрямую кастить от базового к наследнику - это UB ( UNDEFINED BEHAVIOR), когда Вы так в плюсах сделаете, ничего падать не будет, но... (есть шутка, про возможность исполнения при этом боже храни короля))))

2) Правильно: А первого, кто начнет Вам рассказывать про стоимость dynamic_cast - пришибайте вопросом, откуда run-time знает, что каст неправильный?

1) Нет ни какого UB и ни чего не упадет даже когда вернется не JSONObject*, так как реальный тип объекта проверяется через метод jv.isObject(), который как раз вы и не используете.
2) Именно ваш пример может стать нерабочим, если в следующей версии библиотеки появится новый тип данных, который использует JSONObject  как базовый класс. 

 
Sergey Dzyublik:

1) Нет ни какого UB и ни чего не упадет даже когда вернется не JSONObject*, так как реальный тип объекта проверяется через метод 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);
}

Выделил. Проверка только на следующей строке))) В примере у создателя либы, как раз наоборот, сначала проверка, потом каст)

UPD: dynamic_cast в обе стороны работает)

UPD2: если появится наследник у JSONObject, то с чего это упасть должно?

 
Vladimir Simakov:
Мдяя... У Вас UB тут.
UB никакого нет, mql каст включает в себя в том числе и dynamic_cast. просто все упадет в случае неправильного указателя.
 
Andrei Trukhanovich:
UB никакого нет, mql каст включает в себя в том числе и dynamic_cast. просто все упадет в случае неправильного указателя.

Согласен)) Это я по плюсовому)))