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); } 我可以这样写(调用结果是一对一的--即我已经做了所有正确的事情)。 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和变体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' - 没有一个重载可以应用于该函数调用 我不想把它投给int--我懒得写注释,以后我就不明白我在比较什么了,而且枚举只是有趣的,因为它可以用眼睛来读。 谢谢你! Vladimir Simakov 2020.06.11 15:10 #784 Igor Makanu:JSONValue *jv不包含getInt(), getDouble()方法--会有一个错误,需要JSONObject类型--或导致该类型的出现 'getInt' - 没有一个重载可以应用于该函数调用 我不想把它投给int--我懒得写注释,以后我就不明白我在比较什么了,而且枚举只是有趣的,因为它可以用眼睛来读。谢谢你! 你不是有JSONValue:public JSONObject吗? Igor Makanu 2020.06.11 16:33 #785 Vladimir Simakov: 你不是有JSONValue:public JSONObject吗? 它不是这样工作的 库来自github,这里有源代码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(未定义的行为),当你在pluses中这样做时,什么都不会掉,但...(有一个关于能够一边执行一边做的笑话,上帝保佑国王))))。对。JSONObject* jv = dynamic_cast<JSONObject*>(parser.parse(json)); if (jv != NULL && jv.getInt("ActorType") == ActorType) return jv; 而第一个开始告诉你dynamic_cast成本的人--钉子户的问题,运行时如何知道cast是错误的? Sergey Dzyublik 2020.06.11 18:51 #787 Vladimir Simakov: 1) 是的...你这里有一个UB。你不能投向继承者,但你通过创建一个指向继承者的指针并将正确的指针值赋给它,有点绕过了这个问题。 这没关系,但只要它返回一个非JSONObject*,一切都会陷入运行时间)))。 你值得拥有它))))千万不要直接从基地投到继承人身上,这是不确定的行为,当你在正数中这样做时,没有什么会掉下来,但...(有一个笑话,关于在那个上帝保佑国王 2)对了:还有第一个开始告诉你dynamic_cast成本的人--用一个问题钉住他,运行时怎么知道cast是错的? 1) 没有僭越,即使返回的是非JSONObject*,也不会有任何损失,因为真正的对象类型是通过jv.isObject() 方法检查的,这正是你不使用的。 2) 如果库的下一个版本引入了一个使用JSONObject 作为基类的新数据类型,那么就是你的例子可能变得不可行。 Vladimir Simakov 2020.06.11 18:54 #788 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 有一个继承人,为什么要放弃? Andrei Trukhanovich 2020.06.11 19:00 #789 Vladimir Simakov: 是啊...你这里有僭建。 没有僭越,mql cast也包括dynamic_cast。只是在指针错误的情况下,一切都会崩溃。 Vladimir Simakov 2020.06.11 19:02 #790 Andrei Trukhanovich: 没有僭越,mql cast也包括dynamic_cast。只是在指针错误的情况下,一切都会崩溃。 我同意))))。这是我的优点。)) 1...727374757677787980818283848586...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
在这种情况下,成本不高。调用虚拟方法的成本很高(每一次解读解读)。
我没有时间去划出代码,这里有一个方法。
我可以这样写(调用结果是一对一的--即我已经做了所有正确的事情)。
我这样称呼它。
即变体1和变体2的速度是一样的?....当然,我对if()中的字符串长度感到困惑 ...代码 难以阅读,也许是因为习惯问题
我没有时间去划出代码,这里有一个方法。
我可以这样写(调用结果是一对一的--也就是说,我做的一切都正确)。
我这样称呼它。
即变体1和变体2的速度是一样的?....当然,我对if()中的字符串长度感到困惑 .........代码 很难读懂,也许是来自第一手的经验。
如果不经过编译器的优化而完全相同,则第二种方法更快。jo-pointer没有被创建和初始化。
PS。
没有必要。只需返回jv
UPD: 那是更短的吗?UPD: 它更短吗?
JSONValue *jv不包含getInt(), getDouble()方法 - 将是一个错误,需要JSONObject类型 - 或导致该类型的出现
'getInt' - 没有一个重载可以应用于该函数调用
我不想把它投给int--我懒得写注释,以后我就不明白我在比较什么了,而且枚举只是有趣的,因为它可以用眼睛来读。
谢谢你!
JSONValue *jv不包含getInt(), getDouble()方法--会有一个错误,需要JSONObject类型--或导致该类型的出现
'getInt' - 没有一个重载可以应用于该函数调用
我不想把它投给int--我懒得写注释,以后我就不明白我在比较什么了,而且枚举只是有趣的,因为它可以用眼睛来读。
谢谢你!
你不是有JSONValue:public JSONObject吗?
它不是这样工作的
库来自github,这里有源代码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(未定义的行为),当你在pluses中这样做时,什么都不会掉,但...(有一个关于能够一边执行一边做的笑话,上帝保佑国王))))。
对。
而第一个开始告诉你dynamic_cast成本的人--钉子户的问题,运行时如何知道cast是错误的?
1) 是的...你这里有一个UB。你不能投向继承者,但你通过创建一个指向继承者的指针并将正确的指针值赋给它,有点绕过了这个问题。
这没关系,但只要它返回一个非JSONObject*,一切都会陷入运行时间)))。
你值得拥有它))))千万不要直接从基地投到继承人身上,这是不确定的行为,当你在正数中这样做时,没有什么会掉下来,但...(有一个笑话,关于在那个上帝保佑国王
2)对了:还有第一个开始告诉你dynamic_cast成本的人--用一个问题钉住他,运行时怎么知道cast是错的?
1) 没有僭越,即使返回的是非JSONObject*,也不会有任何损失,因为真正的对象类型是通过jv.isObject() 方法检查的,这正是你不使用的。
2) 如果库的下一个版本引入了一个使用JSONObject 作为基类的新数据类型,那么就是你的例子可能变得不可行。
1) 即使没有返回JSONObject*,也没有任何东西会崩溃,因为真正的对象类型是通过jv.isObject() 方法检查的,这正是你不使用的东西。
2) 如果库的下一个版本引入了一个使用JSONObject 作为基类的新数据类型,那么就是你的例子可能变得不可行。
突出的是。只在下一行检查)))在lib创建者的例子中,正好相反,先检查,后投掷)
UPD: dynamic_cast 两种方式都适用)
UPD2: 如果JSONObject 有一个继承人,为什么要放弃?
是啊...你这里有僭建。
没有僭越,mql cast也包括dynamic_cast。只是在指针错误的情况下,一切都会崩溃。
我同意))))。这是我的优点。))