Давайте вместе разберем CObject ? - страница 4

 
Vladimir Pastushak:

Я не понимаю этих вещей


Как работают эти ссылки ? Зачем они ? Может кто нить на пальцах объяснить или показать пример ?


Почти каждый кто заходил тему написал, что они используются для связывания объектов в списки.

 
Vladimir Pastushak:
 

Как работают эти ссылки ? Зачем они ? Может кто нить на пальцах объяснить или показать пример ?

Да тут уже не раз объяснено - это элементы двусвязного списка. Каждый объект списка - указывает на следующий объект в списке, и на предыдущий объект.

Объявляешь объект CList. И пихаешь в него объекты CObject с помощью функции CList:: Add().  В этой функции каждый объект "цепляется" к имеющимся. После того, как ты все нужные объекты передал в CList - ты можешь запросить объекты (узлы) списка с помощью соответствующих функций. А получив один из объектов - сразу получить и следующий (или предыдущий), используя вот эти самые указатели.

Собственно сами указатели заполняются именно в функции CList::Add()

Лично я редко использую списки, мне больше нравится CArrayObj. Но, пару раз были задачи, для которых список был более удобен.
 
George Merts:

Да тут уже не раз объяснено - это элементы двусвязного списка. Каждый объект списка - указывает на следующий объект в списке, и на предыдущий объект.

Объявляешь объект CList. И пихаешь в него объекты CObject с помощью функции CList:: Add().  В этой функции каждый объект "цепляется" к имеющимся. После того, как ты все нужные объекты передал в CList - ты можешь запросить объекты (узлы) списка с помощью соответствующих функций. А получив один из объектов - сразу получить и следующий, используя вот эти самые указатели.

Собственно сами указатели заполняются именно в функции CList::Add()


Большое спасибо!

 

Владимир, посмотрите в Стандартную библиотеку, как используется CList.

Ещё кто-то писал статью про списки, не помню кто...

https://www.mql5.com/ru/articles/709

И, кстати, CObject используется не только в списках, но и других контейнерах, например CArrayObj.

Основы программирования на MQL5 - Списки
Основы программирования на MQL5 - Списки
  • 2013.12.24
  • Dennis Kirichenko
  • www.mql5.com
Новая версия языка программирования торговых стратегий - MQL [MQL5] - имеет более эффективный и мощный инструментарий по сравнению с предыдущей [MQL4]. И это преимущество прежде всего относится к средствам объектно-ориентированного программирования. В данной статье рассматривается возможность использования такого пользовательского типа данных, относящегося к сложному, как узлы и списки. Приводится пример использования списков при программировании практических задач в MQL5.
 
Alexey Navoykov:

Имхо, это не правильная концепция. Если пользователь захочет поместить один объект одновременно в несколько списков (почему бы и нет?), то выйдет облом...


Стесняюсь спросить, а откуда такая уверенность и безапелляционность? Кто мешает один и тот же объект поместить в разные списки?

Тогда на кой разработчик реализовал метод CList::Freemode(), не подскажите?

 

Fremode - для уничтожен объекта при удалении его из списка. 

Смотрим метод Add:

int CList::Add(CObject *new_node)
  {
//--- check
   if(!CheckPointer(new_node))
      return(-1);
//--- add
   if(m_first_node==NULL)
      m_first_node=new_node;
   else
     {
      m_last_node.Next(new_node);
      new_node.Prev(m_last_node);
     }
   m_curr_node=new_node;
   m_curr_idx=m_data_total;
   m_last_node=new_node;
   m_data_sort=false;
//--- result
   return(m_data_total++);
  }
 
Alexey Volchanskiy:

Для использования множественного нужны грамотные программисты, которых тут мало. Потому что можно такого наворотить..

Ой да ладно, можно подумать во всём остальном нельзя наворотить сдуру )  Да и главное чего такого страшного наворотить то. Я понимаю если бы речь шла о прямом доступе к памяти и прочих небезопасных вещах,  а тут просто организация твоего кода - кого она волнует кроме тебя? )
 
Насколько я знаю, MQ уже давно начали разрабатывать множественное наследование. Год назад ещё мне в сервисдеске упоминали об этом. Но похоже дело заглохло. Хотелось бы у них разузнать, что да как, но они в последнее время молчат как партизаны
 
Dennis Kirichenko:

Стесняюсь спросить, а откуда такая уверенность и безапелляционность? Кто мешает один и тот же объект поместить в разные списки?

Тогда на кой разработчик реализовал метод CList::Freemode(), не подскажите?

Нет.

Один и тот же объект нельзя ставить в разные списки, потому, что связность списка определяется как раз цепочкой указателей Next-Previous в самих узлах списка. Если мы добавим узел в один список - то его указатели - будут указывать на узлы этого списка, но как только добавим этот же объект в другой список - его указатели будут переписаны в соответствии с этим новым списком, а информация о старом списке - потеряется.

FreeMode - это селектор метода удаления. Определяет, кто ведает удалением собственно самих объектов. То ли их будет удалять сам список, то ли пользователь.

 
George Merts:

К смарт-поинтерам у меня неоднозначное отношение - мне кажется, их использование оправдано весьма нечасто. А вот код они усложняют очень заметно. Поэтому, я сперва было хотел себе такой класс сделать, но, идея на уровне идеи и осталась...  

Зря вы так. Без смартов приходится устраивать большие нагромождения кода в плане отслеживания перемещения указателей в различных контейнерах.  Видимо вы просто не очень активно используете это.
Да, во многих случаях конечно можно обойтись и без всего этого, если у нас все объекты создаются и уничтожаются в одном месте. Но порой требуется и более гибкий функционал.


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