Обсуждение статьи "Порядок создания и уничтожения объектов в MQL5" - страница 2

 
kashi_ann:

Добрый день,


Ни как не могу понять этот участок:

В начале кода задается что execute = false. Словами: execute равно false.

Первый ЕСЛИ: если значение execute ИСТИНА, то блок должен выполниться. Но в комменте написано что он НЕ выполниться если ИСТИНА и перейдет к следующему.

Второй ЕСЛИ: если значение execute ЛОЖЬ, то блок выполнется. Но опять же в комменте написано что блок ВЫПОЛНИТЬСЯ если ИСТИНА.

Я полагала что ! - это символ отрицания.

Где ошибка в моих рассуждениях?

Выделил цветом Ваше ошибочное суждение. Для справки: 'false' - ЛОЖЬ, 'true' - ПРАВДА.

И чтобы было понятнее добавил комментариев:

//--- этот блок не выполнится, если execute==false
//--- этот блок выполнится, если execute==true
   if(execute)
     {
      CObjectB objB;
     }
//--- этот блок выполнится, если execute==false
//--- этот блок не выполнится, если execute==true
   if(!execute)
     {
      CObjectC objC;
     }
 
Vladimir Karputov:

Выделил цветом Ваше ошибочное суждение. Для справки: 'false' - ЛОЖЬ, 'true' - ПРАВДА.

И чтобы было понятнее добавил комментариев:

так... получается следующие записи...

if(execute = true) и if(execute) - тожественны?
if(execute = false) и if(!execute) - тоже?

верно?

 
kashi_ann:

так... получается следующие записи...

верно?

Это азы.

 
Artyom Trishkin:

Это азы.

Спасибо) Азы - это самое важное)

И спасибо, что не поленились ответить)
 
kashi_ann:

так... получается следующие записи...

верно?

Так совпало, что да, но вы явно хотели использовать ==, а не =.

 
Andrey Khatimlianskii:

Так совпало, что да, но вы явно хотели использовать ==, а не =.

Не))) со смыслом и различием = и == мне еще предстоит разобраться) Я в самом начале пути)

 
kashi_ann:

Не))) со смыслом и различием = и == мне еще предстоит разобраться) Я в самом начале пути)

"=" это оператор присвоения, а "==" - оператор сравнения.
 

<цитата>

@При таком порядке объявления уничтожение items_array происходит до уничтожения массива объектов array[5]. В функции Destroy(), которая вызывается из деструктора items_array, работа ведётся с указателями на ещё существующие объекты, поэтому никаких ошибок не возникает.@ </цитата>

Всем привет!

Вот тут я логики вообще не понял. =) 

Ведь в методе Destroy мы сравниваем тип нашего указателя с динамическим типом. А наш тип автоматический. Следовательно до оператора delete дело просто не доходит.

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

И последнее, в файле забыли указать тип возвращаемого значения void для методов Destroy и SetArray на этапе реализации методов за пределами Класса из-за чего выбивает ошибку.

Новички (как я) могут пугаться =)


void CItemArray::Destroy(void)
  {
   for(int i=0;i<ArraySize(m_array);i++)
     {
      if(CheckPointer(m_array[i])!=POINTER_INVALID)
        {
         if(CheckPointer(m_array[i])==POINTER_DYNAMIC) delete(m_array[i]);
        }
      else Print("Invalid pointer to delete");
     }
  }