如何重写CObject中的Compare(),使CList sort()工作? - 页 4 1234 新评论 Gustavo Hennemann 2017.09.12 16:41 #31 Ex Ovo Omnia: 我只是好奇,为什么你需要在函数Compare() 中使用运算符"&"来获取 "this "的值。因为Compare()方法是 "const",不可能在其中调用非 "const "方法。在这个例子中,见第2页的代码,方法getPrice()不是常数,里面的函数 CopyClose()也不是常数。所有的方法都可以变成 "const",但CopyClose()不是。无论如何,操作符"&"可以访问非常量的方法,所以我们可以在"常量 "方法 中调用它们。 Ex Ovo Omnia 2017.09.12 19:03 #32 Gustavo Hennemann:因为方法Compare()是 "常数",不可能在其中调用非 "常数 "方法。在这个例子中,见第2页的代码,getPrice()方法不是常量,里面的CopyClose()函数 也不是常量。所有的方法都可以变成 "const",但CopyClose()不能。不管怎么说,操作符"&"可以访问非恒定的方法,所以,我们可以在"恒定 "方法 中调用它们。我现在明白了。我不知道这是否是一个有效的结构,也许你知道。对我来说,在MQL中最好完全避免 "const "方法的声明,就像在Java中一样。 nicholish en 2017.09.12 19:15 #33 Ex Ovo Omnia: 我现在明白了。我不知道这是否是一个有效的结构,也许你知道。对我来说,在MQL中最好完全避免'const'方法的声明,就像在Java中一样。为了利用std库的集合类(即搜索、排序等)的(非常有用的)方法,你必须覆盖CObject的比较方法。这意味着所有从比较方法中调用的方法也必须是常量方法。OP并没有规避这个细节,OP只是没有正确使用'this' 指针。因此,OP没有简单地调用this.DoSomething(),而是创建了他自己的(self)对象的指针。 例如,otherSelfPointer.DoSomething() Ex Ovo Omnia 2017.09.12 19:24 #34 nicholishen: 为了利用std库的集合类(即搜索、排序等)的(非常有用的)方法,你必须覆盖CObject的比较方法。这意味着所有从比较方法中调用的方法也必须是常量方法。OP并没有规避这个细节,OP只是没有正确使用this 指针。因此,OP没有调用this.DoSomething(),而是创建了他自己的(self)对象的指针,而不是简单地使用this关键字。 例如:otherSelfPointer.DoSomething()我理解他的做法,现在的问题是,这种结构是否无害(一般来说)。编译器并不期望对象在常量函数中修改其成员。 Gustavo Hennemann 2017.09.12 19:55 #35 Ex Ovo Omnia: 我理解他的做法,现在的问题是,这种结构是否无害(一般而言)。编译器并不期望对象在常量函数中修改其成员。在这个特定的例子中,我只得到了值,我没有改变任何东西。但是,如果我们试图改变一个常量值,编译器可能会提醒这个问题,或者,在最坏的情况下,我们会得到一个运行时异常。 nicholish en 2017.09.14 00:52 #36 Ex Ovo Omnia: 我理解他的做法,现在的问题是,这种结构是否无害(一般而言)。编译器并不期望对象在常量函数中修改其成员。Ohhh....我现在明白了,我的错。这可能有潜在的危险。OP应该确保在Compare()的权限范围内的所有方法也是const方法。 Alain Verleyen 2017.09.20 12:50 #37 Gustavo Hennemann:嗨,@Alain Verleyen。我改变了getPrice()的方法,而不是使用CopyClose(),我使用CopyBuffer()。这并没有改变主要目标。所以,如果我在getPrice()方法中使用 "const "关键字,就会出现错误。"'CopyBuffer'--没有一个重载可以应用于该函数调用"。我认为这是因为CopyBuffer不是一个const方法,而且不可能在const方法中调用非const方法。很抱歉,我没有时间关注这个话题,现在才回复。我还是不明白为什么你在使用CopyBuffer()时不能将getPrice()声明为常量。我不明白,你能把你的getPrice()的更新版本贴出来吗? MOHAMMED SAFAR AL-OTAIBI 2017.10.16 18:19 #38 任何更新 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我只是好奇,为什么你需要在函数Compare() 中使用运算符"&"来获取 "this "的值。
因为Compare()方法是 "const",不可能在其中调用非 "const "方法。
在这个例子中,见第2页的代码,方法getPrice()不是常数,里面的函数 CopyClose()也不是常数。所有的方法都可以变成 "const",但CopyClose()不是。
无论如何,操作符"&"可以访问非常量的方法,所以我们可以在"常量 "方法 中调用它们。
因为方法Compare()是 "常数",不可能在其中调用非 "常数 "方法。
在这个例子中,见第2页的代码,getPrice()方法不是常量,里面的CopyClose()函数 也不是常量。所有的方法都可以变成 "const",但CopyClose()不能。
不管怎么说,操作符"&"可以访问非恒定的方法,所以,我们可以在"恒定 "方法 中调用它们。
我现在明白了。我不知道这是否是一个有效的结构,也许你知道。对我来说,在MQL中最好完全避免 "const "方法的声明,就像在Java中一样。
我现在明白了。我不知道这是否是一个有效的结构,也许你知道。对我来说,在MQL中最好完全避免'const'方法的声明,就像在Java中一样。
为了利用std库的集合类(即搜索、排序等)的(非常有用的)方法,你必须覆盖CObject的比较方法。这意味着所有从比较方法中调用的方法也必须是常量方法。OP并没有规避这个细节,OP只是没有正确使用'this' 指针。因此,OP没有简单地调用this.DoSomething(),而是创建了他自己的(self)对象的指针。 例如,otherSelfPointer.DoSomething()
为了利用std库的集合类(即搜索、排序等)的(非常有用的)方法,你必须覆盖CObject的比较方法。这意味着所有从比较方法中调用的方法也必须是常量方法。OP并没有规避这个细节,OP只是没有正确使用this 指针。因此,OP没有调用this.DoSomething(),而是创建了他自己的(self)对象的指针,而不是简单地使用this关键字。 例如:otherSelfPointer.DoSomething()
我理解他的做法,现在的问题是,这种结构是否无害(一般来说)。编译器并不期望对象在常量函数中修改其成员。
我理解他的做法,现在的问题是,这种结构是否无害(一般而言)。编译器并不期望对象在常量函数中修改其成员。
在这个特定的例子中,我只得到了值,我没有改变任何东西。但是,如果我们试图改变一个常量值,编译器可能会提醒这个问题,或者,在最坏的情况下,我们会得到一个运行时异常。
我理解他的做法,现在的问题是,这种结构是否无害(一般而言)。编译器并不期望对象在常量函数中修改其成员。
Ohhh....我现在明白了,我的错。这可能有潜在的危险。OP应该确保在Compare()的权限范围内的所有方法也是const方法。
嗨,@Alain Verleyen。
我改变了getPrice()的方法,而不是使用CopyClose(),我使用CopyBuffer()。这并没有改变主要目标。
所以,如果我在getPrice()方法中使用 "const "关键字,就会出现错误。"'CopyBuffer'--没有一个重载可以应用于该函数调用"。我认为这是因为CopyBuffer不是一个const方法,而且不可能在const方法中调用非const方法。
很抱歉,我没有时间关注这个话题,现在才回复。
我还是不明白为什么你在使用CopyBuffer()时不能将getPrice()声明为常量。我不明白,你能把你的getPrice()的更新版本贴出来吗?
任何更新