Учёба. Классы. Нужна помощь. - страница 13

 

вот как раз компаре, для чего зачем там????

знаю что можно было давно это уже узнать все.

 
Vitaly Murlenko #:

https://www.mql5.com/ru/docs/standardlibrary/cobject - лучше разработчика я отвечу вряд ли. Наследники уже написаны. Использование символа звёздочки нужно для работы с памятью. Что такое mode - не знаю, но могу предположить, что это как-то связано с созданием нового экземпляра.

P.S.

Классы наследники (судя по справке) написаны разработчиком. Задайте лучше эти вопросы ему .

Это похоже на отмазку при абсолютном незнании.

Вот пример использования виртуальной функции о которой было сказано выше…
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
CArrayObj         list;
//--- Полностью класс я публиковать не буду

template <typename T1>
int CClass::compare(T1 data1, T1 data2) const
 {
  if(data1 == data2)
    return 0;
  if(data1 > data2)
    return 1;
  return -1;
 }
//--- Надо в список объектов list добавить объект, но только если такого ещё нет в списке
//--- Здесь проверяется наличие объекта в списке. Можно проверить по одному полю или по двум, по символу и ТФ
int CClass::Compare(const CObject *node, const int mode=0) const
 {
  const CNewBar *obj = node;
//--- при mode==0 сравниваем всё
  if(mode == 0)
   {
    if(compare(this.Symbol(), obj.Symbol()) == 0)
     {
      return compare(this.Timeframe(), obj.Timeframe());
     }
    else
      return compare(this.Symbol(), obj.Symbol());
    return -1;
   }
//--- при mode==1 сравниваем символ
  if(mode == 1)
    return compare(this.Symbol(), obj.Symbol());
//--- при mode==2 сравниваем таймфреймы
  if(mode == 2)
    return compare(this.Timeframe(), obj.Timeframe());
  return -1;
 }

И самое интересное, никакого цикла для поиска существования в списке…

    list.Sort(0);
    if(list.Search(&tmpObj) == -1)

И работает на удивление шустро…

 
Alexey Viktorov #:

Найди пожалуйста в классе class CObject виртуальную функцию 

и объясни пожалуйста как это работает. Куда какие наследники надо писать? Что означает указатель(если я правильно понимаю) *node 

Что означает mode я примерно понимаю. Но только примерно…


Смотрите. В ООП разработка начинается с проектирования общей концепции, а с помощью базовых классов задаётся формат реализации этой концепции.

Вернёмся к CObject. Объекты этого класса могут объединяться в списки (методы Prev и Next). Очевидно, что могут быть созданы потомки, которые реализуют коллекции объектов CObject. Таким потомком является CArray. В классе CArray  есть метод Sort, который должен отсортировать элементы коллекции. Это метод как раз и будет вызывать метод Compare у элементов коллекции. Класс CArray "знает" про класс CObject и его методы и ничего "не знает" о потомках, но поскольку метод виртуальный, то будет вызван метод потомка. Соответственно, в потомке требуется реализовать корректное сравнение объекта с другим объектом. Этот "другой" объект передаётся в метод Compare посредством ссылки *node.

Т.е. Вы реализуете свой класс CMyObject как потомок CObject, реализуете метод Compare. Далее можно создать объект класса CArray, наполнить его вашими CMyObject и сортировка будет работать.

Как-то так. Надеюсь понятно.
 
Alexey Viktorov #:

Это похоже на отмазку при абсолютном незнании.

Вот пример использования виртуальной функции о которой было сказано выше…

И самое интересное, никакого цикла для поиска существования в списке…

И работает на удивление шустро…

это худший пример

просил популярный, без шаблонов, без включаемых функций

+

и самое главное для чего и почему может понадобиться виртуальная функция

 
lynxntech #:

это худший пример

просил популярный, без шаблонов, без включаемых функций

Да там шаблон - не играет особой роли. А включаемых функций там нет, подключаемые файлы - это необходимые файлы для работы самого CObject и СArrayObj

Ну, вот, на прошлом листе - мой пример. Класс постоянно работает во всех моих экспертах, вполне отлажен. Как раз работа с методом Compare() - вполне ясна. Хотя, и в нём тоже есть подключаемые файлы. 

 
Georgiy Merts #:

Да там шаблон - не играет особой роли. 

Ну, вот, на прошлом листе - мой пример. Класс постоянно работает во всех моих экспертах, вполне отлажен. Как раз работа с методом Compare() - вполне ясна. 

Алексей просто замусорил "пример" условиями

 
lynxntech #:

и самое главное для чего и почему может понадобиться виртуальная функция

Виртуальная функция - это единый "интерфейс функции" для различных наследников. 

Виртуальная функция нужна тогда, когда во время написания кода сортировки - ты ещё не знаешь, что конкретно будешь сортировать. То ли строки, то ли цифры, то ли какие-то объекты. 

Ты пишешь функцию сортировки, в котором вызываешь для сравнения эту самую функцию. 

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

В этом и есть "сила" виртуальных функций. 

В дальнейшем - ты создаёшь объекты, пронаследованные от CObject, в каждом из которых пишешь свою функцию сравнения, которая, однако, поддерживает этот самый виртуальный механизм. И твои объекты сразу же начинают нормально сортироваться, причём по настраиваемому критерию (параметр mode). 


Без виртуальных функций такую возможность реализовать значительно сложнее. 

 
lynxntech #:

это худший пример

просил популярный, без шаблонов, без включаемых функций

+

и самое главное для чего и почему может понадобиться виртуальная функция

Так и я этого понимания хочу. Это мне «права купили, а ездить не научили…», примерно так-же. 

Даже имея этот пример, я не понимаю что тут происходит. 

Вот вижу попытки объяснить, но и сейчас, пока, до меня на очень доходит. Буду напрягать мышцы головы… Может смогу понять.

 
lynxntech #:

Алексей просто замусорил "пример" условиями

Там все условия "к месту". Просто, там сразу раскрываются два момента - сама сущность виртуализации, и одновременно работа режима сортировки (переменная mode). Для новичков это может представляться, как "слишком много сравнений".

 
lynxntech #:
и самое главное для чего и почему может понадобиться виртуальная функция

вот эти писаки в статьях, написали три слова, свою функцию выполнили, все статьи тут дерьмовые, написаны на отб-ь