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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Tango_X
715
Tango_X  

Здравствуйте! Помогите разобраться как правильно удалять элемент из массива экземпляров класса*

К примеру есть массив классов из 5 элементов

CName* cname[5];
for(int i=0; i<5; i++) 
  {
   cname[i]=new CName(i);
  }

далее я хочу удалить к примеру второй элемент этого массива 

for(int i=0; i<5; i++) 
  {
   if (i==1) delete(cname[i]);
  }		

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

ArrayResize(cname,4);	

Потом я должен сместить все элементы значения массива влево, как это делается c обычными массивами при помощи ArrayCopy(), но в справке пишется что копировать классы нельзя. 

В итоге получается ошибка - invalid pointer access in ....!

for(int i=0; i<4; i++) 
  {
   if (i==1) Print (cname[i].переменная);
  }

 т.е. обьект удаляется, но остается дырка в массиве).

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


P.S.

Создается массив обьектов типа класс и потом я работаю с этим массивом и в процессе мне к примеру нужно удалить определенный элемент этого массива и работать дальше с этим массивом как я работал до этого.

Alexey Volchanskiy
27265
Alexey Volchanskiy  
Tango_X:

Здравствуйте! Помогите разобраться как правильно удалять элемент из массива экземпляров класса*

К примеру есть массив классов из 5 элементов

далее я хочу удалить к примеру второй элемент этого массива 

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

Потом я должен сместить все элементы значения массива влево, как это делается c обычными массивами при помощи ArrayCopy(), но в справке пишется что копировать классы нельзя. 

В итоге получается ошибка - invalid pointer access in ....!

 т.е. обьект удаляется, но остается дырка в массиве).

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


Использовать CList из стандартной библиотеки вместо массива

Tango_X
715
Tango_X  
Alexey Volchanskiy:

Использовать CList из стандартной библиотеки вместо массива


Спасибо! Попытаюсь понять как это сделать) 

Alexey Volchanskiy
27265
Alexey Volchanskiy  
Tango_X:

Спасибо! Попытаюсь понять как это сделать) 


Еще можно посмотреть CArrayObj, там есть метод удаления элемента с ресайзом. В справке эти классы описаны

Andrey Miguzov
2055
Andrey Miguzov  
Tango_X:

Здравствуйте! Помогите разобраться как правильно удалять элемент из массива экземпляров класса*

К примеру есть массив классов из 5 элементов

далее я хочу удалить к примеру второй элемент этого массива 

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

Потом я должен сместить все элементы значения массива влево, как это делается c обычными массивами при помощи ArrayCopy(), но в справке пишется что копировать классы нельзя. 

В итоге получается ошибка - invalid pointer access in ....!

 т.е. обьект удаляется, но остается дырка в массиве).

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


#include <Arrays\List.mqh>  
//---  

   CList *cname=new CList;  
   //---  
   if(cname==NULL)  
     {  
      printf("Object create error");  
      return;  
     }  
   //--- add 5 elements  
   for(int i=0;i<5;i++)  
     {  
      if(cname.Add(new CName)==-1)  
        {  
         printf("Element addition error");  
         delete cname;  
         return;  
        }  
     }  

//--- use cname  
//--- . . .  

//---удалить к примеру второй элемент
  if(!cname.Delete(1))  
     {  
      printf("Delete error");  
      delete cname;  
      return;  
     } 

//--- CList сам следит за отсутствием "дырок в массиве"

//--- delete cname  
delete cname;  

Посмотрите подробнее здесь

ЗЫ: пока писал - уже ответили

Tango_X
715
Tango_X  
Andrey Miguzov:

Посмотрите подробнее здесь

ЗЫ: пока писал - уже ответили


Все равно спасибо за советы!

Tango_X
715
Tango_X  
Andrey Miguzov:

Посмотрите подробнее здесь

ЗЫ: пока писал - уже ответили


у меня выдает ошибку 'CName' - declaration without typе, и еще не могу понять где и как мне подставить свой массив экземпляров обьектов? 

Извините, только учусь..

Я так понимаю CName - это мой класс и в нем я должен указать унаследование от CList - может так понимать это?



Vasiliy Pushkaryov
6959
Vasiliy Pushkaryov  
Tango_X:

Потом я должен сместить все элементы значения массива влево, как это делается c обычными массивами при помощи ArrayCopy(), но в справке пишется что копировать классы нельзя.

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

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

Tango_X
715
Tango_X  
Vasiliy Pushkaryov:

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

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


Я работаю на платформе робофорекса, а у них почему то версия MetaTrader 5 build 1596, а новый билд версии MetaTrader 5 build 1625

Dmitry Fedoseev
56693
Dmitry Fedoseev  

Надо удалить объект (delete), сдвинуть массив, и после этого уменьшить размер массива (а не уменьшить размер массива и сдвинуть).

Tango_X
715
Tango_X  
Dmitry Fedoseev:

Надо удалить объект (delete), сдвинуть массив, и после этого уменьшить размер массива (а не уменьшить размер массива и сдвинуть).

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

к примеру есть массив обьектов Arr.

MyClass* Arr[5];

В нем нужно удалить к примеру второй элемент. предложили использовать CList, но я не понял как его использовать

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий