Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 25
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Просто зачем создавать коллекции и выкладывать их в кодобазу если они годятся только для встроенных типов?)
для встроенных структур они тоже не годятся
Скажите, может я чего не понимаю, но если пытаюсь использовать конструкцию такого типа:
то ловлю ошибку:
'Option' - objects are passed by reference only ICollection.mqh 14 18
ну и там полный стэк ошибок дальше...так работать не будет, через шаблоны template нужно делать, я тоже с этим вопросом разбирался, вот делал себе тестовый пример, вроде все корректно работает
class CData - структура которую хотим в списке хранить
CDataBase - сам список
в OnStart() - создаем список, записываем в него значения и потом читаем, 2 раза это проверяю, т.к. сначала где то потерял видимость локальной переменной при записи в список - записывал все ОК, а когда читал, тогда нулевые поинтеры читал и ошибку получал
так работать не будет, через шаблоны template нужно делать, я тоже с этим вопросом разбирался, вот делал себе тестовый пример, вроде все корректно работает
class CData - структура которую хотим в списке хранить
CDataBase - сам список
в OnStart() - создаем список, записываем в него значения и потом читаем, 2 раза это проверяю, т.к. сначала где то потерял видимость локальной переменной при записи в список - записывал все ОК, а когда читал, тогда нулевые поинтеры читал и ошибку получал
У Вас этот код работает, потому что CData это все же класс, а ни какая не структура. При одновременной попытке использовать генерик для классов и структур сразу вылезут проблемы, особенно с оператором delete. На своих экспериментах с этим "generic" убедился в этом. Суть в том, что у этой либы "generic" нет оператора delete вовсе и если в такую "коллекцию" запихать new class, то после выхода из программы будет куча потеренных объектов. Т.е. видно что изначально этот генерик писался только для примитивных типов.
У Вас этот код работает, потому что CData это все же класс, а ни какая не структура. При одновременной попытке использовать генерик для классов и структур сразу вылезут проблемы, особенно с оператором delete. На своих экспериментах с этим "generic" убедился в этом. Суть в том, что у этой либы "generic" нет оператора delete вовсе и если в такую "коллекцию" запихать new class, то после выхода из программы будет куча потеренных объектов. Т.е. видно что изначально этот генерик писался только для примитивных типов.
конечно класс, а не структура, я перестал использовать структуры в MQL, преимуществ структуры не дают, а вот постоянные баги и потерю времени при работе со структурами они обеспечат- читал старые сообщения админов на вопросы по поводу структур, в основном они отвечали используйте класс вместо структуры - теперь структурами не пользуюсь вообще
ЗЫ: вот нашел, когда перестал структурами попользоваться https://www.mql5.com/ru/forum/6343/page866#comment_7541747
зачем создавать коллекции и выкладывать их в кодобазу если они годятся только для встроенных типов?)
Удобство, что идут в стандартной поставке. Следовательно, не нужно тянуть - есть у каждого пользователя.
Пользуюсь этим в одной их своих КБ-либ для long.
так работать не будет, через шаблоны template нужно делать, я тоже с этим вопросом разбирался, вот делал себе тестовый пример, вроде все корректно работает
class CData - структура которую хотим в списке хранить
CDataBase - сам список
в OnStart() - создаем список, записываем в него значения и потом читаем, 2 раза это проверяю, т.к. сначала где то потерял видимость локальной переменной при записи в список - записывал все ОК, а когда читал, тогда нулевые поинтеры читал и ошибку получал
Ну во-первых вы свой аллокатор реализовали над списком и храните там указатели. Мало того, у вас утечки при уничтожении)
Во-вторых, по правильному нужно было через конструктор копирования сделать, а не оператор присваивания. Но это все ИМХО)
А главное: разработчикам надо просто допилить дженерики, сделать аллокаторы внутри и поддержку пользовательских объектов. C++ уже все придумал за них) И нам не придумывать велосипедов.
Ну во-первых вы свой аллокатор реализовали над списком и храните там указатели. Мало того, у вас утечки при уничтожении)
как утечки определили?
ЗЫ: это тестовый пример, мне нужно было разобраться как со списками работать в MQL, вот и делал тесты
А главное: разработчикам надо просто допилить дженерики, сделать аллокаторы внутри и поддержку пользовательских объектов. C++ уже все придумал за них) И нам не придумывать велосипедов.
напишите если все так просто.
как утечки определили?
ЗЫ: это тестовый пример, мне нужно было разобраться как со списками работать в MQL, вот и делал тесты
Вы создаете копии объектов в AddValue через new, но не освобождаете их в деструкторе, просто список указателей очищаете.
напишите если все так просто.
будет время и необходимость - напишу. А вообще, как пример, создавать свой завод по производству подшипников не очень хорошая тема, если вам нужна всего одна модель подшипников)