MQL5中的OOP问题 - 页 67

 

这里还有一个问题,这里是维基 的文章抽象类

我对一个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(),不管声明和初始化的顺序如何。


全部在一个循环中

是否有可能以一种简单的方式做到这一点?

[删除]  
Igor Makanu:

当然是在一个周期内。

是否可以用简单的方法?

而且为什么他妈的需要在一个周期内完成?

而为什么它也是自然的呢?

自然,至少会有两个周期。

 
Koldun Zloy:

而且为什么他妈的要在同一周期内完成?

而为什么它也是自然的呢?

自然,至少会有两个周期。

好吧,两个周期意味着两个周期,所以没有奇迹(()。

 
Igor Makanu:

好吧,2个周期意味着2个周期,所以没有奇迹(()。

你可以尝试完全摆脱循环。
有一些例子说明如何在没有循环和没有递归的情况下从1到100进行打印。
也许这些例子会有帮助,如果它是相关的))。

Печать от 1 до 100 на C ++, без цикла и рекурсии | Портал информатики для гиков
  • 2020.01.01
  • espressocode.top
Ниже приводится программа на C ++, которая печатает от 1 до 100 без цикла и без рекурсии. #include using namespace std;    template
 
Roman:
这种胡说八道有什么意义?
 
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. 你怎么能想象,在一般情况下,如果不进行分类,一半的对象会先被执行,然后是其他的?:)好吧,如果只是为了启动一个工作队列。

但这是一个创造性的问题,你可以想出很多复杂的方法来解决一分钱的问题)))最主要的是不要侵犯物理定律,一切都会好起来的)))。

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

谢谢,这是很清晰的画面

 
Igor Makanu:

绝对不要,我认为编译器会对空方法进行优化。

但无论如何,调用一个空函数不可能吃很多东西。

Igor Makanu:

好吧,2个循环意味着2个循环,所以不会有奇迹发生((

我为什么要把在逻辑上可以用两个循环完成的事情塞进一个循环呢? 因为没有速度,没有清晰度和简单性的收益,而且硬盘的大小早就用兆字节而不是百万字节来衡量。

 
Andrei Trukhanovich:

为什么要把逻辑上可以用两个周期完成的事情塞进一个周期呢? 在速度、清晰度或简单性方面没有任何好处,而且硬盘的大小也不是以兆字节来衡量的。

我甚至还没有用过它们呢!))))

只需要知道规格,就可以做出类似于正常方法调用的事情。

谢谢你,这很好地解释了它。

Andrei Trukhanovich:

虚拟? 不一定。

我希望能给你看一个例子,这个问题的出现是因为多态性 手段的巨大选择,要么是虚拟的,要么是没有,要么是继承或在派生类中关闭这个方法。

 
Roman:

你可以尝试完全摆脱循环。
有一些例子说明如何在没有循环和没有递归的情况下从1到100进行打印。
也许这些例子会有帮助,如果它是相关的))。

为什么?另一种模式。唯一的一点是,模式专家不承认它,显然它不是正统的和正统的。 为什么不是递归?同样是递归,只不过不是沿着,而是跨越。