初学者的问题 MQL5 MT5 MetaTrader 5 - 页 192

 

我已经开始学习OOP,但无法克服以下障碍。下面的脚本是一个例子。

CSum result;
void OnStart()
  {
//---
  }
//+----------------------------------------+
class CSum
  {
public:
   int               Calculate(int A,int B);
  };
//---
int CSum::Calculate(int A,int B)
  {
   return(A+B);
  }

如果没有 "CSum result; "一行,编译器就不会产生错误。但它会导致一个错误。

请告诉我什么是错的。我似乎已经正确地声明了这个类对象

 
paladin800:

我已经开始学习OOP,但无法克服以下障碍。下面的脚本是一个例子。

如果没有 "CSum result; "一行,编译器就不会产生错误。但它会导致一个错误。

请告诉我什么是错的。我似乎已经正确地声明了这个类对象

一个CSum(结果)类型的变量是在CSum描述完成之前声明的,这意味着编译器还不知道这个类型。在文件的最开始插入CSum。
 
Lone_Irbis:
另外,全局变量 系统可以/应该被利用到什么程度?是否有可能以这种方式超载,或者有一个限度?例如,让我们说两个或更多的数百个变量(其中约有一半变成输入和返回,这取决于哪一段代码需要测试)和全局级别的约十几个小数组--是很多还是很少?^^' 那如果在你微调系统时,有两到三倍的人呢?而且,如果我们不必如此得寸进尺,是否有更简单的方法来处理十几个不同子系统之间的数据交换,其中许多子系统需要彼此的结果?
不,没有。全局变量被用于其他目的。使用类来描述子系统。而且你最好完全避免使用数组和全局变量。
 
C-4:
CSum(结果)类型的变量--是在CSum描述之前声明的,这意味着编译器还不知道这个类型。在文件的最开始插入CSum。
哎呀,成功了。我通过类比函数的位置,把类放在了代码的最后。我没有想到,对于一个班级来说,这样的排序会产生不同的效果。
 
paladin800:
哎呀,成功了。我把类放在代码的最后,类似于函数的位置。我没有想到,这样的排序会给班级带来变化。
是的,不幸的是,优先权的顺序确实很重要。最难的情况是两个班级同时使用对方。无论我们先引入什么类,第二个类都会被编译器发现并产生一个错误。在这种情况下,你不能不做类声明。在你的情况下,最好将CSum分离成一个单独的文件,例如Sum.mqh,并使用#include "Sum.mqh "口令将其包含在内。
 
C-4:
不,你不应该。全局变量被用于其他目的。使用类来描述子系统。而且,最好根本不使用数组和全局变量。
当然,我明白使用类是个好主意,但我还是有点懒,考虑到没有类会更熟悉,而且它们似乎在任何情况下都能发挥作用。但我只是好奇,他们的优势在哪里?只要人们确信代码是由一个作者专门为自己写的,并且在特定的程序之外永远不会有用?一直以来,似乎只有当你为某人/某事/某物写作时,上课才有意义,而对于你自己来说,作为一种爱好,不会有太大的区别。除了美学和一般的 "一般 "之外,参与所有这些类-结构有什么实际意义吗?速度?还有什么事吗?
 
Lone_Irbis:
当然我明白,处理类的问题会很好,但我还是很懒,考虑到没有类的问题会更熟悉,而且无论如何它们似乎都能发挥作用。但我只是好奇,他们的优势是什么?只要人们确信代码是由一个作者专门为自己写的,并且在特定的程序之外永远不会有用?一直以来,似乎只有当你为某人/某事/某物写作时,上课才有意义,而对于你自己来说,作为一种爱好,不会有太大的区别。除了美学和一般的 "一般 "之外,参与所有这些类-结构有什么实际意义吗?速度?其他的东西?

恰恰相反。当你写一个定制项目时,客户往往要求提供源代码。然后你必须从类中提取函数,并将其插入到源代码中。最好是给客户一个文件,而不是把你的库拖成一座山,其中包含大量的函数,这些函数在传递给客户的工作中并没有使用。也就是说,最好是按需使用结构化编程。

为了你自己的需要,最好使用OOP--那里的一切都自给自足,你不必为转移源代码而烦恼。

 
artmedia70:

恰恰相反。当你写一个定制项目时,客户往往要求提供源代码。然后你必须从类中提取函数,并将其插入到源代码中。最好是给客户一个文件,而不是把你的库拖成一座山,其中包含大量的函数,这些函数在传递给客户的工作中并没有使用。也就是说,对于客户来说,最好使用结构化编程。

为了你自己的需要,最好使用OOP--你所有的东西都在那里,而且你不必为转移源代码而烦恼。

嗯...嗯,也许是这样 :)当然,这个原则看起来很诱人......。在理论上。特别是考虑到我不能做一个没有任何结构或类的单一文件。问题是,我写作主要是出于兴趣,测试自己的随机理论,发明无尽的自行车。同时,我只研究开始需要实施这个想法的东西。所有这一切都发生在一个单一的学习和实验性专家顾问的框架内--最初是一个简单的马汀,但现在它更像是一个多功能的黄牛在萌芽状态(而且理论上已经盈利)。因此,在某些时候,机器人变得微不足道地太大。>.> 当大部分时间都花在滚动鼠标轮寻找正确的代码时,我有了一个 "天才 "的想法,把它做成独立的文件(目前有13个部分可以连接),只是按照一般的概念把功能分组。像这里的新闻解析器,那里的水平处理,另一个有麋鹿控制器,单独的统计,等等。但当时我对处理OOP的热情还不够......

因此,我的问题,显然是,我只是抓住我想出的每一个想法,并在现有的机器人上进行修改,而不是在一个相当...混乱的序列。其结果相当怪异,有各种开关和组合模式,其中许多都没有做。整个画面被一百五十个全局变量 所补充,这些变量必须从输入中删除,只是为了不花那么多时间,在一开始就被印在测试器的显象器中。当然,还有堆积如山的垃圾和被放弃或重新设计的想法的雏形。

而现在似乎是一个很好的时间来整理所有这些垃圾,并把所有东西都归入类中(首先至少要读完一篇关于OOP的文章,而不要在这个过程中睡着)......但我对需要完成的工作量感到困惑,嗯,它与整个事情的潜在意义的关系。这是对所有课程的总结--它似乎不是那么体积化的任务。但是,如果,举例来说,把一排的所有东西都倾倒在公共场合,忽略所有这些私人/受保护的东西,这有意义吗?这比有一个文件夹,里面有一堆.mph和十几个常见的函数,如果它们无论如何都会在一个机器人中结束,那怎么会好呢?

 
Lone_Irbis:

我建议你做一个单一的模板,它已经有所有必要的初始化、连接、收集总是需要的数据等步骤。

一个意想不到的想法涌上心头--加载一个模板,重新命名,只在其中写上与该特定想法相关的内容。而那些你总是使用的函数,在任何代码中,在任何情况下返回相同的数据--把它们放在类中。一切都会一下子落到实处。你也可以构建目录。在 \experts\中创建(我是这样做的)一个名为订单的文件夹,我还把属于不同客户的所有文件放在不同的文件夹中,有一个名为想法、测试等的文件夹。

通过这种方式,你可以使事情保持有序。

 
不幸的是,即使正式学习了OOP,你也无法构建一个OOP程序。相反,你需要深入了解这种方法的哲学,这是在获得正式知识之后的下一个层次。因此,事实证明,你真的需要它吗?但如果你问如何做得更好,这意味着你觉得你选择的方式不是最佳的。在任何情况下,选择权在于你。