Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 25

 
Andrey Pogoreltsev:

Просто зачем создавать коллекции и выкладывать их в кодобазу если они годятся только для встроенных типов?)

для встроенных структур они тоже не годятся

 
Andrey Pogoreltsev:

Скажите, может я чего не понимаю, но если пытаюсь использовать конструкцию такого типа:

то ловлю ошибку:

'Option' - objects are passed by reference only ICollection.mqh 14 18

ну и там полный стэк ошибок дальше...

так работать не будет, через шаблоны template нужно делать, я тоже с этим вопросом разбирался, вот делал себе тестовый пример, вроде все корректно работает

class CData - структура которую хотим в списке хранить

CDataBase - сам список

#property strict
#include <Arrays\List.mqh>

//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
   datetime          t;
  };
//+------------------------------------------------------------------+
template<typename TDB>class CDataBase
  {
private:
   CList            *mlist;
   TDB              *TDBptr;
public:
   void CDataBase()           { mlist=new CList;                                       }
   void ~CDataBase(void)      { delete mlist;                                          }
   int ArraySize(void)        { return(mlist.Total());                                 }
   TDB *operator[](int index) { return(mlist.GetNodeAtIndex(index));                   }
   void  AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return(typename(TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart()
  {

   CDataBase<CData>*data=new CDataBase<CData>;
   CData *my=new CData;

   int i;
   Print("1------------------------------------");
   for(i=0; i<10; i++)
     {
      my.x=i;
      my.y= i*2;
      data.AddValue(my);
      Print(i," : ",data[i].x," , ",data[i].y," / ",my.x," ,",my.y);
     }
   Print("2------------------------------------");
   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

в OnStart() - создаем список, записываем в него значения и потом читаем, 2 раза это проверяю, т.к. сначала где то потерял видимость локальной переменной при записи в список - записывал все ОК, а когда читал, тогда нулевые поинтеры читал и ошибку получал

 
Igor Makanu:

так работать не будет, через шаблоны template нужно делать, я тоже с этим вопросом разбирался, вот делал себе тестовый пример, вроде все корректно работает

class CData - структура которую хотим в списке хранить

CDataBase - сам список

в OnStart() - создаем список, записываем в него значения и потом читаем, 2 раза это проверяю, т.к. сначала где то потерял видимость локальной переменной при записи в список - записывал все ОК, а когда читал, тогда нулевые поинтеры читал и ошибку получал

У Вас этот код работает, потому что CData это все же класс, а ни какая не структура. При одновременной попытке использовать генерик для классов и структур сразу вылезут проблемы, особенно с оператором delete. На своих экспериментах с этим "generic" убедился в этом. Суть в том, что у этой либы "generic" нет оператора delete вовсе и если в такую "коллекцию" запихать new class, то после выхода из программы будет куча потеренных объектов. Т.е. видно что изначально этот генерик писался только для примитивных типов.

 
Vasiliy Sokolov:

У Вас этот код работает, потому что CData это все же класс, а ни какая не структура. При одновременной попытке использовать генерик для классов и структур сразу вылезут проблемы, особенно с оператором delete. На своих экспериментах с этим "generic" убедился в этом. Суть в том, что у этой либы "generic" нет оператора delete вовсе и если в такую "коллекцию" запихать new class, то после выхода из программы будет куча потеренных объектов. Т.е. видно что изначально этот генерик писался только для примитивных типов.

конечно класс, а не структура, я перестал использовать структуры в MQL, преимуществ структуры не дают, а вот постоянные баги и потерю времени при работе со структурами они обеспечат- читал старые сообщения админов на вопросы по поводу структур, в основном они отвечали используйте класс вместо структуры - теперь структурами не пользуюсь вообще

ЗЫ: вот нашел, когда перестал структурами попользоваться  https://www.mql5.com/ru/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev:

зачем создавать коллекции и выкладывать их в кодобазу если они годятся только для встроенных типов?)

Удобство, что идут в стандартной поставке. Следовательно, не нужно тянуть - есть у каждого пользователя.

Пользуюсь этим в одной их своих КБ-либ для long.

 
Igor Makanu:

так работать не будет, через шаблоны template нужно делать, я тоже с этим вопросом разбирался, вот делал себе тестовый пример, вроде все корректно работает

class CData - структура которую хотим в списке хранить

CDataBase - сам список

в OnStart() - создаем список, записываем в него значения и потом читаем, 2 раза это проверяю, т.к. сначала где то потерял видимость локальной переменной при записи в список - записывал все ОК, а когда читал, тогда нулевые поинтеры читал и ошибку получал

Ну во-первых вы свой аллокатор реализовали над списком и храните там указатели. Мало того, у вас утечки при уничтожении)

Во-вторых, по правильному нужно было через конструктор копирования сделать, а не оператор присваивания. Но это все ИМХО)

А главное: разработчикам надо просто допилить дженерики, сделать аллокаторы внутри и поддержку пользовательских объектов. C++ уже все придумал за них) И нам не придумывать велосипедов.

 
Andrey Pogoreltsev:

Ну во-первых вы свой аллокатор реализовали над списком и храните там указатели. Мало того, у вас утечки при уничтожении)

как утечки определили?

ЗЫ: это тестовый пример, мне нужно было разобраться как со списками работать в MQL, вот и делал тесты

 
Andrey Pogoreltsev:

А главное: разработчикам надо просто допилить дженерики, сделать аллокаторы внутри и поддержку пользовательских объектов. C++ уже все придумал за них) И нам не придумывать велосипедов.

напишите если все так просто.

 
Igor Makanu:

как утечки определили?

ЗЫ: это тестовый пример, мне нужно было разобраться как со списками работать в MQL, вот и делал тесты

Вы создаете копии объектов в AddValue через new, но не освобождаете их в деструкторе, просто список указателей очищаете.

 
TheXpert:

напишите если все так просто.

будет время и необходимость - напишу. А вообще, как пример, создавать свой завод по производству подшипников не очень хорошая тема, если вам нужна всего одна модель подшипников)

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