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

 
Tango_X:

Так вот вопрос - как сдвинуть? ArrayCopy() для классов не работает


Здесь у вас указатели используются, для них сработает ArrayCopy. Вы почти все правильно делаете в первом посте, только не в том порядке.

 
Vasiliy Pushkaryov:

По идее, в последнем билде должно просто копироваться. Тут писали в пункте 8:

"MQL5: Добавлена автоматическая генерация неявного оператора копирования для объектов структур и классов. Теперь компилятор автоматически создает операторы копирования, что позволяет писать для объектов простые записи вида b=a:"


Зачем делать сложно, то, что проще простого )) Есть же CList и CArrayObj, что хочешь, то и используй. Дык  нет же, упорно лезем в нативные массивы. Уже и пример человеку написали.

 
Alexey Volchanskiy:

Зачем делать сложно, то, что проще простого )) Есть же CList и CArrayObj, что хочешь, то и используй. Дык  нет же, упорно лезем в нативные массивы. Уже и пример человеку написали.


Расскажите пожалуйста немного подробнее.

Как удалить элемент с моего массива, т.е. как применить CList

к примеру имеем вот такое обьявление

MyClass* Arr[5]; - нужно удалить второй элемент 

В примере кода я не разобрался - у меня не получилось(
 
Tango_X:

Расскажите пожалуйста немного подробнее.

Как удалить элемент с моего массива, т.е. как применить CList

к примеру имеем вот такое обьявление

MyClass* Arr[5]; - нужно удалить второй элемент 

В примере кода я не разобрался - у меня не получилось(

Вам же в посте 4 Andrey Miguzov написал подробный пример.

 
Alexey Volchanskiy:

Вам же в посте 4 Andrey Miguzov написал подробный пример.


//+------------------------------------------------------------------+
//|                                                        Proba.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#include <Arrays\List.mqh>
#include <MyClass.mqh>

//--- input parameters
input int      Input1;
input int      Input2;

int k_=0;

MyClass *Arr[5];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
k_++;
if (k_==1)
 {
   CList *Arr=new CList;  
   //---  
   if(Arr==NULL)  
     {  
      printf("Object create error");  
      return(0);  
     }  
   //--- add 5 elements  
   for(int i=0;i<5;i++)  
     {  
      if(Arr.Add(new CList)==-1)  
        {  
         printf("Element addition error");  
         delete Arr;  
         return(0);  
        }  
      Arr[i].num=i; - вот тут моя ошибка -'[' - array required	....
                                          'num' - struct member undefined.....
      хотя в классе MyClass переменная num указана
          	class MyClass
                         {
                            private:

                            public:
                            MyClass();
                           ~MyClass();
                 int        num;
                        };

     } 
    
   //---удалить к примеру второй элемент
   if(!Arr.Delete(1))  
     {  
      printf("Delete error");  
      delete Arr;  
      return(0);  
     } 
 
    
 }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Tango_X:


Уфффф все смешалось в доме Облонских )) 

 
Alexey Volchanskiy:

Уфффф все смешалось в доме Облонских )) 


Приятного аппетита)

 
Про меня забыли(
 

Попробовал использовать класс из стандартной библиотеки CList, попробовл удалить элементы массива, все получилось, НО теперь не понятно как обращаться к моему классу а именно к его методам и переменным???

CList   *myList=new CList; 
      
       for (int i=0;i<5;i++) 
            myList.Add(new MyClass);- это мой класс
      
       myList.Delete(1);
       myList.Delete(2);

       delete(myList);
 
Tango_X:

Попробовал использовать класс из стандартной библиотеки CList, попробовл удалить элементы массива, все получилось, НО теперь не понятно как обращаться к моему классу а именно к его методам и переменным???


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

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

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

MyClass* mc = (MyClass*)myList.GetNodeAtIndex(3);
Причина обращения: