MQL5中的OOP问题 - 页 67 1...606162636465666768697071727374...96 新评论 Igor Makanu 2020.05.28 12:46 #661 这里还有一个问题,这里是维基 的文章抽象类 我对一个C++的例子感兴趣 class CA { // Абстрактный класс public: CA ( void ) { std::cout << "This object of the class "; } virtual void Abstr ( void ) = 0; // Чистая (пустая) виртуальная функция. void fun ( void ) { std::cout << "Реализация не будет наследоваться!"; } ~CA () { std::cout << "." << std::endl; } //Вызывается в обр. порядке конструкторов }; class CB : public CA { public: CB ( void ) { std::cout << "CB;"; } void Abstr ( void ){ std::cout << " call function cb.Abstr();"; } //Подменяющая функция. void fun ( void ){ std::cout << " call function cb.fun()"; } ~CB () {} // Неверно для абстр. кл. ~CB(){ ~CA(); } }; class CC : public CA { public: CC ( void ) { std::cout << "CC;"; } void Abstr ( void) { std::cout << " call function cc.Abstr();"; } //Подменяющая функция. void fun ( void ) { std::cout << " call function cc.fun()"; } ~CC () {} // Неверно для абстр. кл. ~CC(){ ~CA(); } }; int main () { std::cout << "Program:" << std::endl; CB cb; cb.Abstr(); cb.fun(); cb.~CB(); CC cc; cc.Abstr(); cc.fun(); cc.~CC(); return 0; } 该计划的结果。 计划。 这个对象属于CB类;调用函数cb.Abstr();调用函数cb.fun()。 这个对象属于CC类;调用函数cc.Abstr();调用函数cc.fun()。 . . 对void fun(无效)方法感兴趣。 - 为什么没有虚拟指定器? - 如果我们增加虚拟,以后会有什么变化? 为什么,为什么,这里是代码。 class base { public: virtual void HighPriorityTask() {} virtual void Task() {} }; //+------------------------------------------------------------------+ class A: public base { public: virtual void HighPriorityTask() { Print(__FUNCSIG__); } }; //+------------------------------------------------------------------+ class B: public base { public: virtual void Task() { Print(__FUNCSIG__); } }; //+------------------------------------------------------------------+ void OnStart() { base *obj[4];; obj[0] = new A; obj[1] = new A; obj[2] = new B; obj[3] = new B; for(int i=ArraySize(obj)-1; i>=0; i--) { obj[i].HighPriorityTask(); obj[i].Task(); } for(int i=ArraySize(obj)-1; i>=0; i--) delete obj[i]; 2020.05.28 14:41:20.294 tst (EURUSD,H1) void B::Task() 2020.05.28 14:41:20.298 tst (EURUSD,H1) void B::Task() 2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask() 2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask() 我有一个基类并继承了它,但我的后代只需要一个方法,我想先调用有HighPriorityTask()方法的对象,然后再调用Task(),不管声明和初始化的顺序如何。 全部在一个循环中 是否有可能以一种简单的方式做到这一点? Questions on OOP in [Archive] Learn how to VPS not working [删除] 2020.05.28 14:31 #662 Igor Makanu: 当然是在一个周期内。 是否可以用简单的方法? 而且为什么他妈的需要在一个周期内完成? 而为什么它也是自然的呢? 自然,至少会有两个周期。 Igor Makanu 2020.05.28 15:38 #663 Koldun Zloy: 而且为什么他妈的要在同一周期内完成? 而为什么它也是自然的呢? 自然,至少会有两个周期。 好吧,两个周期意味着两个周期,所以没有奇迹(()。 Roman 2020.05.28 17:17 #664 Igor Makanu: 好吧,2个周期意味着2个周期,所以没有奇迹(()。 你可以尝试完全摆脱循环。有一些例子说明如何在没有循环和没有递归的情况下从1到100进行打印。 也许这些例子会有帮助,如果它是相关的))。 Печать от 1 до 100 на C ++, без цикла и рекурсии | Портал информатики для гиков 2020.01.01espressocode.top Ниже приводится программа на C ++, которая печатает от 1 до 100 без цикла и без рекурсии. #include using namespace std; template TheXpert 2020.05.28 17:37 #665 Roman: 这种胡说八道有什么意义? Aleksey Mavrin 2020.05.28 19:14 #666 Igor Makanu: 这里还有一个问题,这里是维基 的文章抽象类 我对一个C++的例子感兴趣 该计划的结果。 计划。 这个对象属于CB类;调用函数cb.Abstr();调用函数cb.fun()。 这个对象属于CC类;调用函数cc.Abstr();调用函数cc.fun()。 . . 对void fun(无效)方法感兴趣。 - 为什么没有虚拟指定器? - 如果我们增加虚拟,以后会有什么变化? 为什么,为什么,这里是代码。 2020.05.28 14:41:20.294 tst (EURUSD,H1) void B::Task() 2020.05.28 14:41:20.298 tst (EURUSD,H1) void B::Task() 2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask() 2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask() 我有一个基类并继承了它,但我的后代只需要一个方法,我想先调用有HighPriorityTask()方法的对象,然后再调用Task(),不管声明和初始化的顺序如何。 全部在一个循环中 是否有可能以一种简单的方式做到这一点? 1.如果你声明了一个基类指针并创建了一个子对象,那么当通过这个基类的相同指针调用方法时。 a) 虚拟方法由子类调用(通过为此目的专门创建的虚拟函数表)。 b)非 虚拟方法由基类调用。即使它们在子类中被重写。 2.如果你想有一个单一的循环,那么 a) 按类型对对象阵列进行排序。 b) 对于每个具体的任务,保留一个单独的指向解决这些任务的对象的数组。即所有必须调用HighPriorityTask 的对象 应存储在一个单独的数组中,应先调用该数组。 h.e. 你怎么能想象,在一般情况下,如果不进行分类,一半的对象会先被执行,然后是其他的?:)好吧,如果只是为了启动一个工作队列。 但这是一个创造性的问题,你可以想出很多复杂的方法来解决一分钱的问题)))最主要的是不要侵犯物理定律,一切都会好起来的)))。 Igor Makanu 2020.05.28 19:32 #667 Aleksey Mavrin: 2.如果你想使用同一个循环,那么 a) 按类型对对象阵列进行排序。 b) 对于特定的任务,保持单独的指向执行这些任务的对象的数组。即所有必须调用HighPriorityTask 的对象 应存储在一个单独的数组中,应先调用该数组。 h.e. 你怎么能想象,在一般情况下,如果不进行分类,一半的对象会先被执行,然后是其他的?:)好吧,如果只是为了启动一个工作队列。 但这是一个创造性的问题,你可以想出很多复杂的方法来解决一分钱的任务)))最主要的是不要侵犯物理规律,一切都会好起来的)))))。 我不想这样,我相信编译器会对空方法进行优化。 Aleksey Mavrin:1.如果你声明了一个基类的指针并创建了一个子对象,那么当通过这个基类的指针调用方法时 a) 虚拟方法由子类调用(通过为此目的专门创建的虚拟函数表)。 b)非 虚拟方法由基类调用。即使它们在子类中被重写。 是的,我不记得我刚刚修复了json库https://www.mql5.com/en/code/11134(我在某个比KB更新鲜的githab上发现的)。 并出现了编译器警告 被废弃的行为,隐藏的方法调用将在未来的MQL编译器版本中被禁用。 通过指定一个类中的方法来固定 this.JSONValue:: getLong(getValue(index),out); 谢谢,这是很清晰的画面 Andrei Trukhanovich 2020.05.28 19:42 #668 Igor Makanu: 绝对不要,我认为编译器会对空方法进行优化。 但无论如何,调用一个空函数不可能吃很多东西。 Igor Makanu:好吧,2个循环意味着2个循环,所以不会有奇迹发生(( 我为什么要把在逻辑上可以用两个循环完成的事情塞进一个循环呢? 因为没有速度,没有清晰度和简单性的收益,而且硬盘的大小早就用兆字节而不是百万字节来衡量。 Igor Makanu 2020.05.28 20:27 #669 Andrei Trukhanovich: 为什么要把逻辑上可以用两个周期完成的事情塞进一个周期呢? 在速度、清晰度或简单性方面没有任何好处,而且硬盘的大小也不是以兆字节来衡量的。 我甚至还没有用过它们呢!)))) 只需要知道规格,就可以做出类似于正常方法调用的事情。 谢谢你,这很好地解释了它。 Andrei Trukhanovich:虚拟? 不一定。 我希望能给你看一个例子,这个问题的出现是因为多态性 手段的巨大选择,要么是虚拟的,要么是没有,要么是继承或在派生类中关闭这个方法。 Dmitry Fedoseev 2020.05.29 04:26 #670 Roman: 你可以尝试完全摆脱循环。有一些例子说明如何在没有循环和没有递归的情况下从1到100进行打印。 也许这些例子会有帮助,如果它是相关的))。 为什么?另一种模式。唯一的一点是,模式专家不承认它,显然它不是正统的和正统的。 为什么不是递归?同样是递归,只不过不是沿着,而是跨越。 1...606162636465666768697071727374...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这里还有一个问题,这里是维基 的文章抽象类
我对一个C++的例子感兴趣
该计划的结果。
计划。
这个对象属于CB类;调用函数cb.Abstr();调用函数cb.fun()。
这个对象属于CC类;调用函数cc.Abstr();调用函数cc.fun()。
.
.
对void fun(无效)方法感兴趣。
- 为什么没有虚拟指定器?
- 如果我们增加虚拟,以后会有什么变化?
为什么,为什么,这里是代码。
2020.05.28 14:41:20.294 tst (EURUSD,H1) void B::Task()
2020.05.28 14:41:20.298 tst (EURUSD,H1) void B::Task()
2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()
2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()
我有一个基类并继承了它,但我的后代只需要一个方法,我想先调用有HighPriorityTask()方法的对象,然后再调用Task(),不管声明和初始化的顺序如何。
全部在一个循环中
是否有可能以一种简单的方式做到这一点?
当然是在一个周期内。
是否可以用简单的方法?
而且为什么他妈的需要在一个周期内完成?
而为什么它也是自然的呢?
自然,至少会有两个周期。
而且为什么他妈的要在同一周期内完成?
而为什么它也是自然的呢?
自然,至少会有两个周期。
好吧,两个周期意味着两个周期,所以没有奇迹(()。
好吧,2个周期意味着2个周期,所以没有奇迹(()。
你可以尝试完全摆脱循环。
有一些例子说明如何在没有循环和没有递归的情况下从1到100进行打印。
也许这些例子会有帮助,如果它是相关的))。
这里还有一个问题,这里是维基 的文章抽象类
我对一个C++的例子感兴趣
该计划的结果。
计划。
这个对象属于CB类;调用函数cb.Abstr();调用函数cb.fun()。
这个对象属于CC类;调用函数cc.Abstr();调用函数cc.fun()。
.
.
对void fun(无效)方法感兴趣。
- 为什么没有虚拟指定器?
- 如果我们增加虚拟,以后会有什么变化?
为什么,为什么,这里是代码。
2020.05.28 14:41:20.294 tst (EURUSD,H1) void B::Task()
2020.05.28 14:41:20.298 tst (EURUSD,H1) void B::Task()
2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()
2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()
我有一个基类并继承了它,但我的后代只需要一个方法,我想先调用有HighPriorityTask()方法的对象,然后再调用Task(),不管声明和初始化的顺序如何。
全部在一个循环中
是否有可能以一种简单的方式做到这一点?
1.如果你声明了一个基类指针并创建了一个子对象,那么当通过这个基类的相同指针调用方法时。
a) 虚拟方法由子类调用(通过为此目的专门创建的虚拟函数表)。
b)非 虚拟方法由基类调用。即使它们在子类中被重写。
2.如果你想有一个单一的循环,那么
a) 按类型对对象阵列进行排序。
b) 对于每个具体的任务,保留一个单独的指向解决这些任务的对象的数组。即所有必须调用HighPriorityTask 的对象
应存储在一个单独的数组中,应先调用该数组。
h.e. 你怎么能想象,在一般情况下,如果不进行分类,一半的对象会先被执行,然后是其他的?:)好吧,如果只是为了启动一个工作队列。
但这是一个创造性的问题,你可以想出很多复杂的方法来解决一分钱的问题)))最主要的是不要侵犯物理定律,一切都会好起来的)))。
2.如果你想使用同一个循环,那么
a) 按类型对对象阵列进行排序。
b) 对于特定的任务,保持单独的指向执行这些任务的对象的数组。即所有必须调用HighPriorityTask 的对象
应存储在一个单独的数组中,应先调用该数组。
h.e. 你怎么能想象,在一般情况下,如果不进行分类,一半的对象会先被执行,然后是其他的?:)好吧,如果只是为了启动一个工作队列。
但这是一个创造性的问题,你可以想出很多复杂的方法来解决一分钱的任务)))最主要的是不要侵犯物理规律,一切都会好起来的)))))。
我不想这样,我相信编译器会对空方法进行优化。
1.如果你声明了一个基类的指针并创建了一个子对象,那么当通过这个基类的指针调用方法时
a) 虚拟方法由子类调用(通过为此目的专门创建的虚拟函数表)。
b)非 虚拟方法由基类调用。即使它们在子类中被重写。
是的,我不记得我刚刚修复了json库https://www.mql5.com/en/code/11134(我在某个比KB更新鲜的githab上发现的)。
并出现了编译器警告
被废弃的行为,隐藏的方法调用将在未来的MQL编译器版本中被禁用。
通过指定一个类中的方法来固定
this.JSONValue:: getLong(getValue(index),out);谢谢,这是很清晰的画面
绝对不要,我认为编译器会对空方法进行优化。
但无论如何,调用一个空函数不可能吃很多东西。
好吧,2个循环意味着2个循环,所以不会有奇迹发生((
我为什么要把在逻辑上可以用两个循环完成的事情塞进一个循环呢? 因为没有速度,没有清晰度和简单性的收益,而且硬盘的大小早就用兆字节而不是百万字节来衡量。
为什么要把逻辑上可以用两个周期完成的事情塞进一个周期呢? 在速度、清晰度或简单性方面没有任何好处,而且硬盘的大小也不是以兆字节来衡量的。
我甚至还没有用过它们呢!))))
只需要知道规格,就可以做出类似于正常方法调用的事情。
谢谢你,这很好地解释了它。
虚拟? 不一定。
我希望能给你看一个例子,这个问题的出现是因为多态性 手段的巨大选择,要么是虚拟的,要么是没有,要么是继承或在派生类中关闭这个方法。
你可以尝试完全摆脱循环。
有一些例子说明如何在没有循环和没有递归的情况下从1到100进行打印。
也许这些例子会有帮助,如果它是相关的))。
为什么?另一种模式。唯一的一点是,模式专家不承认它,显然它不是正统的和正统的。 为什么不是递归?同样是递归,只不过不是沿着,而是跨越。