массив экземпляров класса - правильное удаление элемента - страница 3

 
Alexey Volchanskiy:

Справку читайте, конкретно 

Справочник MQL5 / Стандартная библиотека / Коллекции данных / CList / GetNodeAtIndex

Надо получить указатель на экземпляр вашего MyClass и далее с ним работать


С Вашей помощью все получилось. Спасибо!

   CList *MyList=new CList;  
   MyClass *Arr;
   //---  
   if(MyList==NULL)  
     {  
      printf("Object create error");  
      return(0);  
     }  
   //--- add 5 elements  
   for(int i=0;i<5;i++)  
     {  
      if(MyList.Add(new MyClass)==-1)  
        {  
         printf("Element addition error");  
         delete MyList;  
         return(0);  
        } 
        Arr=MyList.GetNodeAtIndex(i);
        Arr.num=i;
     } 
    
   //---удалить к примеру второй элемент
   if(!MyList.Delete(1))  
     {  
      printf("Delete error");  
      delete MyList;  
      return(0);  
     } 
    if(!MyList.Delete(2))  
     {  
      printf("Delete error");  
      delete MyList;  
      return(0);  
     }   
   for (int i=0;i<MyList.Total();i++)
      {
         Arr=MyList.GetNodeAtIndex(i);
         Print(Arr.num);
      }
   delete(MyList);
 
Alexey Volchanskiy:

Справочник MQL5 / Стандартная библиотека / Коллекции данных / CList / GetNodeAtIndex

Странно, что не сделали это через operator[]. Он же там напрашивается!

 
fxsaber:

Странно, что не сделали это через operator[]. Он же там напрашивается!


Тогда нужно будет следить еще и за этим массивом ( operator[] ), используя ArrayCopy - для смещения при удалении элемента, ArrayResize - для изменения размера этого массива, а так мы просто опериуем указателями на обьеты.

если я не прав поправьте.

 
Tango_X:

если я не прав поправьте.

В Include\Arrays\List.mqh сделать правку

//+------------------------------------------------------------------+
//| Get a pointer to the position of element in the list             |
//+------------------------------------------------------------------+
//CObject *CList::GetNodeAtIndex(int index)
CObject* CList::operator[]( int index )

И тогда код станет таким

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

массив экземпляров класса - правильное удаление элемента

Tango_X, 2017.07.07 09:09

   CList *MyList=new CList;  
   MyClass *Arr;
   //---  
   if(MyList==NULL)  
     {  
      printf("Object create error");  
      return(0);  
     }  
   //--- add 5 elements  
   for(int i=0;i<5;i++)  
     {  
      if(MyList.Add(new MyClass)==-1)  
        {  
         printf("Element addition error");  
         delete MyList;  
         return(0);  
        } 
//        Arr=MyList.GetNodeAtIndex(i);
        Arr=MyList[i];
        Arr.num=i;
     } 
    
   //---удалить к примеру второй элемент
   if(!MyList.Delete(1))  
     {  
      printf("Delete error");  
      delete MyList;  
      return(0);  
     } 
    if(!MyList.Delete(2))  
     {  
      printf("Delete error");  
      delete MyList;  
      return(0);  
     }   
   for (int i=0;i<MyList.Total();i++)
      {
//         Arr=MyList.GetNodeAtIndex(i);
         Arr=MyList[i];
         Print(Arr.num);
      }
   delete(MyList);
 
fxsaber:

В Include\Arrays\List.mqh сделать правку

И тогда код станет таким


Для меня конечно это все новое - но по логике не вижу разницы 

между 

Arr=MyList.GetNodeAtIndex(i);

и

Arr=MyList[i];
 
fxsaber:

В Include\Arrays\List.mqh сделать правку

И тогда код станет таким


Да, так красивше. Только править list.mqh нельзя, при первом обновлении терминала файл перепишется. Надо наследоваться.

 
fxsaber:

Странно, что не сделали это через operator[]. Он же там напрашивается!

CList писали давно. Тогда ещё нельзя было так делать :)

 
#include <Arrays\ArrayObj.mqh>

template<typename T>
class objvector : public CArrayObj
{
public:
   T  operator[](const int index) const { return (T)At(index); }
};


#include <Arrays\objvector.mqh>

class MyClass : public CObject
{
protected:
   int      m_index;
public:
            MyClass(int index):m_index(index){}
   MyClass* Print()  {::Print    ("index = "+string(m_index));return &this;}
   MyClass* Alert()  {::Alert    ("index = "+string(m_index));return &this;}
   MyClass* Comment(){::Comment  ("index = "+string(m_index));return &this;}
};

void OnStart()
{
   objvector<MyClass*> array;
   
   for(int i=0;i<5;i++)
      array.Add(new MyClass(i));
   
   array.Delete(2);

   for(int i=0;i<array.Total();i++)
      array[i].Print().Alert().Comment();
}
Файлы:
objvector.mqh  1 kb
 
nicholishen:



Спасибо!