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

 
Alexey Viktorov #:

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

Я что-то не понял... Ты ж сам привёл пример, говоришь, работает быстро - значит, всё понял? 

Или не понял? 

Что конкретно непонятно-то? 

 
lynxntech #:

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

Какими условиями? И это не пример, а рабочая функция.

Что касается шаблона, так я и сам недавно понял как это работает. А когда понял радовался как ребёнок… Постарайся понять «и будет тебе счастье»…

 
Alexey Viktorov #:

Какими условиями? И это не пример, а рабочая функция.

Что касается шаблона, так я и сам недавно понял как это работает. А когда понял радовался как ребёнок… Постарайся понять «и будет тебе счастье»…

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

 

сейчас наверное посыпется на меня)

шаблон и перегрузка, перегрузка реально использовалась для умножения на 10)

шаблоны даже не знаю

 
lynxntech #:

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

Чтобы это не показывать, мне пришлось бы это переделывать. А оно мне надо?

Мне проще попытаться вам объяснить как это работает. Вот скрипт

void OnStart()
 {
  int int_1 = 1, int_2 = 2;
  long long_1 = 20, long_2 = 10;
  double double_1 = 11.0, double_2 = 11.0;
  fff(int_1,int_2);
  fff(long_1,long_2);
  fff(double_1,double_2);
 }
template <typename T1>
void fff(T1 data_1, T1 data_2)
 {
  printf("В функцию переданы переменные типа %s ", typename(T1));
 }

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

Но можно обойтись и одной…

2024.12.16 10:39:27.909 Test shablon (GBPUSD,H4)        В функцию переданы переменные типа int 
2024.12.16 10:39:27.909 Test shablon (GBPUSD,H4)        В функцию переданы переменные типа long 
2024.12.16 10:39:27.909 Test shablon (GBPUSD,H4)        В функцию переданы переменные типа double 

Т1 — это новый тип переменной. Можно поставить любое имя, хоть luntick. И какой-бы тип не передали в эту функцию сравнение или какие-то действия будет корректным.

Более подробно читайте в документации.

 
Georgiy Merts #:

Я что-то не понял... Ты ж сам привёл пример, говоришь, работает быстро - значит, всё понял? 

Или не понял? 

Что конкретно непонятно-то? 

Нет, не совсем понимаю. Мне хотелось-бы понимать не только эту функцию, а вообще как это работает… Из учебника и статей, а тем более из документации этого понять не могу.

В классе CTrade есть такие виртуальные функции

   virtual double    CheckVolume(const string symbol,double volume,double price,ENUM_ORDER_TYPE order_type);
   virtual bool      OrderCheck(const MqlTradeRequest &request,MqlTradeCheckResult &check_result);
   virtual bool      OrderSend(const MqlTradeRequest &request,MqlTradeResult &result);

И мне кажется они никак не используются, если работать через этот класс. 

В других местах есть другие. Вот и хочется понять как это работает.

 
Alexey Viktorov #:

Чтобы это не показывать. мне пришлось бы это переделывать. А оно мне надо?

Мне проще попытаться вам объяснить как это работает. Вот скрипт

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

Но можно обойтись и одной…

Т1 — это новый тип переменной. Можно поставить любое имя, хоть luntick. И какой-бы тип не передали в эту функцию сравнение будет корректным.

Более подробно читайте в документации.

в том и дело что зачем огромный код, когда можно в трех словах объяснить

Жорж нписал, даже смотреть не хочу, у него код черно-белый)

 
Alexey Viktorov #:

Нет, не совсем понимаю. Мне хотелось-бы понимать не только эту функцию, а вообще как это работает… Из учебника и статей, а тем более из документации этого понять не могу.

В классе CTrade есть такие виртуальные функции

И мне кажется они никак не используются, если работать через этот класс. 

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

Если почему-либо не устраивают возможности функции OrderSend, можно сделать производный класс от CTrade, в котором заменить эту функцию своей, оставив всё остальное как было.

 
Georgiy Merts #:
Вот, для иллюстрации прикрепляю свой класс CFrameData - это объект фрейма, который используется для работы с результатами оптимизации. Как раз он пронаследован от CObject (CMyObject - это тот же  CObject  с небольшими добавлениями). Погляди, как там организованная функция Comparе! (Там много других функций и ссылок на другие файлы, но эта - достаточно ясно написана, и для неё всё должно быть понятно.)

Самое интересное как раз-таки осталось за кадром.

Georgiy Merts #:
int CFrameData::Compare(const CObject *poNode,const int iMode) const
{
   CFrameData* pfdAnother = CONVERT_CONST_OBJECT_WITH_CHECK(poNode,CFrameData,MOT_FRAME_DATA);

Что внутри? switch? dynamic_cast?

 
Sergey Gridnev #:

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

Вот ещё что забыл указать. Если бы метод Compare не был виртуальным, то CArray из функции Sort вызвал бы метод класса CObject.