Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1334

 
Artyom Trishkin:
Это Алексей что-то переделывал в том коде, который я давал. А может и я недоглядел - писал "на коленке" в качестве простого примера для пояснения уже не помню чего.

М.б. Алексей расскажет)

 
Valeriy Yastremskiy:

Итерацию цикла не закончит и новую не начнет, а перейдет к следующему Иф. Логика поменяется.

Нет. Там условие изначально поставлено так, если указатель создан успешно, то добавить его в список. Кривая скобка закрыта и если произошёл сбой, то просто добавление не будет выполняться. А с оператором continue; логика чуток другая, но результат тот-же.
 

Artyom Trishkin:
Это Алексей что-то переделывал в том коде, который я давал. А может и я недоглядел - писал "на коленке" в качестве простого примера для пояснения уже не помню чего.

//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
 }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm = this.Time();
   if(tm == 0)
      return false;
   if(tm != this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }


Артем, а для чего здесь используется ключевое слово this ?  Ведь и без него методы будут работать с членами класса...

 
Mikhail Tkachev:

Алексей, спасибо за столь развернутый ответ.
В приведенном фрагменте кода непонятно назначение переменной ret...
Для чего она вычисляется, если в любом случае метод возвращает array[0] ?
З.Ы.
А для чего в методе класса использовать this ? Мы ведь работает с членами этого конкретного класса...


  1. Поскольку функция CopyTime возвращает значение, то пусть возвращает в переменную, от этого хуже не будет… В случае отладки можно будет проверить что получилось.
  2. this писал Артём. Видимо это личные предпочтения. Некоторые, надо — не надо пишут ::
ps; Я только сейчас заметил что тип переменной ret datetime… Конечно должна быть типа int. Ну да ладно, тоже надо будет исправить…
 
Alexey Viktorov:
  1. Поскольку функция CopyTime возвращает значение, то пусть возвращает в переменную, от этого хуже не будет… В случае отладки можно будет проверить что получилось.
  2. this писал Артём. Видимо это личные предпочтения. Некоторые, надо — не надо пишут ::

1. А для чего здесь  функция CopyTime ?

2. М.б. Артем ответит про this - это личные предпочтения или обязательно нужно ?

 
Mikhail Tkachev:

1. А для чего здесь  функция CopyTime ?

2. М.б. Артем ответит про this - это личные предпочтения или обязательно нужно ?

Не нравится CopyTime(), замените на iTime(). Нет никакой разницы, главное получить время текущего бара.

В моей голове смутно всплывает воспоминание о том когда это писалось. Кажется и я задавал этот вопрос… И если ничего не путаю, то this гарантирует, что обращение будет только к здешним методам в случае если одноимённые есть в других классах. И конечно, уточнит Артём.

 
Alexey Viktorov:
Нет. Там условие изначально поставлено так, если указатель создан успешно, то добавить его в список. Кривая скобка закрыта и если произошёл сбой, то просто добавление не будет выполняться. А с оператором continue; логика чуток другая, но результат тот-же.

Да, результат одинаков, внутри разно. По мне с континью быстрее, хотя на цвет и на логику ....

 
Mikhail Tkachev:


Артем, а для чего здесь используется ключевое слово this ?  Ведь и без него методы будут работать с членами класса...

Будут. Я использую потому, что так хочу :) Это явно указывает методы какого именно класса используются.

Если у вас есть два класса - один родительский, а второй соответственно - наследник, и в них определены два метода с одинаковыми именами, но они не являются виртуальными по некоторым соображениям, то тут придётся явно указывать какой метод нужно использовать.

Допустим родительский класс - это CParent, а наследуемый класс - это класс CInherited, и они оба имеют метод Method().

В этом случае, если мы в родительском классе CParent вызываем метод Method(), то однозначно будет вызван метод класса CParent - здесь this не обязателен. Можно вызывать метод как с ним, так и без него.

Если мы в наследуемом классе CInherited вызовем метод Method(), то будет вызван тоже метод этого класса, так как сначала ищется метод, принадлежащий тому классу, из которого был его вызов.

Если мы в наследуемом классе CInherited вызовем этот метод таким образом CParent::Method(), то будет вызван уже метод родительского класса, так как тут мы явно оператором разрешения контекста указали метод, принадлежащий родительскому классу.

Но всё же я бы вызывал метод Method() в наследуемом классе CInherited с указанием this - чтобы быть точно уверенным, что будет вызван метод именно этого (this == "этот") наследуемого класса.

Есть и другие объяснения использования this. Может кто более опытный в ООП расскажет.

 
Valeriy Yastremskiy:

Да, результат одинаков, внутри разно. По мне с континью быстрее, хотя на цвет и на логику ....

Не должно быть никакой разницы. Просто для меня так приятнее код выглядит - меньше загружен скобками и отступами.

 
Alexey Viktorov:
  1. Поскольку функция CopyTime возвращает значение, то пусть возвращает в переменную, от этого хуже не будет… В случае отладки можно будет проверить что получилось.
  2. this писал Артём. Видимо это личные предпочтения. Некоторые, надо — не надо пишут ::
ps; Я только сейчас заметил что тип переменной ret datetime… Конечно должна быть типа int. Ну да ладно, тоже надо будет исправить…

Ну да. Я один из этих "некоторых", особенно, когда из класса вызываю стандартную функцию, то обязательно указываю глобальный контекст. Просто из-за того, что могу вздумать в этом классе прописать метод с таким же именем, как у стандартной функции - чтобы никогда не забыть что он делает. И вот тогда-то и пригодятся :: для вызова стандартной функции, а this - для вызова моего одноимённого метода.