методы стандартной библиотеки ArrayObj.mqh

 

Еще один вопрос по использованию стандартной библиотеки

//+------------------------------------------------------------------+
//|                                    CollObjectRemoveDublicate.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

class CMyObject : public CObject
{
   public:
   string meInt;
   
virtual int                 Compare(CObject *node,const int mode=1)
  {
  if(this.meInt == dynamic_cast<CMyObject*>(node).meInt)
    {
     return(1);
    }
  else
    {
     return(0);
    }
}   
   
};

class CCollOfMyObjects : public CArrayObj
{
   public:
   bool  isIn(CMyObject *inObject);
};

bool CCollOfMyObjects::isIn(CMyObject *inObject)
{
   CMyObject *lMyObj;
   for(int i=0;i<this.Total();i++)
     {
     lMyObj = this.At(i);
      if(inObject.Compare(lMyObj,1))
        {
         return(true);
        }
     }
   return(false);
}

void OnStart()
  {
//---
   int lRez;
   CMyObject *lMyObject1, *lMyObject2, *lMyObject3, *lMyObject4, *lMyObject5;
   CCollOfMyObjects *lCollNonUnique;
   CCollOfMyObjects *lCollUnique;
   
   lMyObject1     = new CMyObject;
   lMyObject2     = new CMyObject;
   lMyObject3     = new CMyObject;
   lMyObject3     = new CMyObject;
   lMyObject4     = new CMyObject;
   lMyObject5     = new CMyObject;   
   
   
   lCollNonUnique = new CCollOfMyObjects;
   lCollUnique    = new CCollOfMyObjects;
   
   lMyObject1.meInt = 10;
   lMyObject2.meInt = 10;
   lMyObject3.meInt = 20;
   lMyObject4.meInt = 20;
   lMyObject5.meInt = 30;
   lCollNonUnique.Add(lMyObject1);
   lCollNonUnique.Add(lMyObject2);
   lCollNonUnique.Add(lMyObject3);
   lCollNonUnique.Add(lMyObject4);
   
   bool flag;
   
   lMyObject1.Compare(lMyObject3,1);
   
   flag = lCollNonUnique.isIn(lMyObject1);
   flag = lCollNonUnique.isIn(lMyObject5);
   
   lCollNonUnique.Sort(1);
   flag = lCollNonUnique.Search(lMyObject1);
   flag = lCollNonUnique.Search(lMyObject5);
   
   printf("compare result = ",lRez);
   
  }
//+------------------------------------------------------------------+

при работе своего метода .isIn корректно вызывается виртуальная функция Compare класса CMyObject => isIn возвращает true для lMyObject1 и false для lMyObject5

при работе специального метода Search в обоих случаях true. 

При отладке вижу, что вызов t_node.Compare работает мимо переопределенного метода класса CMyObject  




Не подскажете любезно, почему?

 
Nikolai Karetnikov:

Еще один вопрос по использованию стандартной библиотеки

при работе своего метода .isIn корректно вызывается виртуальная функция Compare класса CMyObject => isIn возвращает true для lMyObject1 и false для lMyObject5

при работе специального метода Search в обоих случаях true. 

При отладке вижу, что вызов t_node.Compare работает мимо переопределенного метода класса CMyObject  




Не подскажете любезно, почему?

А потому, что ты не переопределил, а перегрузил метод. Смотри внимательней сигнатуры. const T и T - это два разных типа)))

 
Vladimir Simakov:

А потому, что ты не переопределил, а перегрузил метод. Смотри внимательней сигнатуры. const T и T - это два разных типа)))

сигнатуру поправил, спасибо! ) 

только как теперь от const CObject *node получить публичное свойство потомка?


 
Nikolai Karetnikov:

сигнатуру поправил, спасибо! ) 

только как теперь от const CObject *node получить публичное свойство потомка?


А зачем ты каст убрал? В CObject, нет такого поля)))
 
Vladimir Simakov:
А зачем ты каст убрал? В CObject, нет такого поля)))

так если б все так было просто )


 
int Compare(const CObject *node,const int mode=1) const

int Compare(const CObject *node,const int mode=1)
Разницу в сигнатурах ощущаешь?)))
 
Nikolai Karetnikov:

так если б все так было просто )


Вот если бы я тебе про спецификатор const не сказал, ты когда бы догодался?)))

UPD нет тут const_cast
 

Не буду дальше мучить)

int Compare(const CObject *node,const int mode=1) const{
  const CMyObject* tmp=dynamic_cast<const CMyObject*>(node);
  return !tmp||this.meInt!=tmp.meInt?0:1;
}  
 
Vladimir Simakov:

Не буду дальше мучить)

Спасибо! )))

 
Nikolai Karetnikov:

Спасибо! )))

Vladimir Simakov:

Не буду дальше мучить)

компилируется, но переопределенная функция все равно игнорируется. 

Еще что-то я упускаю

 
Nikolai Karetnikov:

компилируется, но переопределенная функция все равно игнорируется. 

Еще что-то я упускаю

Если ты ничего в своем коде не менял, то как раз CObject::Compare(...) не вызывается.

Причина обращения: