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

我可以这样写(调用结果是一对一的--即我已经做了所有正确的事情)。

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-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' - 没有一个重载可以应用于该函数调用

我不想把它投给int--我懒得写注释,以后我就不明白我在比较什么了,而且枚举只是有趣的,因为它可以用眼睛来读。

谢谢你!

 
Igor Makanu:

JSONValue *jv不包含getInt(), getDouble()方法--会有一个错误,需要JSONObject类型--或导致该类型的出现

'getInt' - 没有一个重载可以应用于该函数调用

我不想把它投给int--我懒得写注释,以后我就不明白我在比较什么了,而且枚举只是有趣的,因为它可以用眼睛来读。

谢谢你!

你不是有JSONValue:public JSONObject吗?
 
Vladimir Simakov:
你不是有JSONValue:public JSONObject吗?

它不是这样工作的

库来自github,这里有源代码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(未定义的行为),当你在pluses中这样做时,什么都不会掉,但...(有一个关于能够一边执行一边做的笑话,上帝保佑国王))))。

对。

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

而第一个开始告诉你dynamic_cast成本的人--钉子户的问题,运行时如何知道cast是错误的?

 
Vladimir Simakov:
1) 是的...你这里有一个UB。你不能投向继承者,但你通过创建一个指向继承者的指针并将正确的指针值赋给它,有点绕过了这个问题。
这没关系,但只要它返回一个非JSONObject*,一切都会陷入运行时间)))。

你值得拥有它))))千万不要直接从基地投到继承人身上,这是不确定的行为,当你在正数中这样做时,没有什么会掉下来,但...(有一个笑话,关于在那个上帝保佑国王

2)对了:还有第一个开始告诉你dynamic_cast成本的人--用一个问题钉住他,运行时怎么知道cast是错的?

1) 没有僭越,即使返回的是非JSONObject*,也不会有任何损失,因为真正的对象类型是通过jv.isObject() 方法检查的,这正是你不使用的。
2) 如果库的下一个版本引入了一个使用JSONObject 作为基类的新数据类型,那么就是你的例子可能变得不可行。

 
Sergey Dzyublik:

1) 即使没有返回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);
}

突出的是。只在下一行检查)))在lib创建者的例子中,正好相反,先检查,后投掷)

UPD: dynamic_cast 两种方式都适用)

UPD2: 如果JSONObject 有一个继承人,为什么要放弃?

 
Vladimir Simakov:
是啊...你这里有僭建。
没有僭越,mql cast也包括dynamic_cast。只是在指针错误的情况下,一切都会崩溃。
 
Andrei Trukhanovich:
没有僭越,mql cast也包括dynamic_cast。只是在指针错误的情况下,一切都会崩溃。

我同意))))。这是我的优点。))