ООП. Вопросы применения - страница 3

 

Техническая ссылка. Пример "механизма оборачивания" при работе с классами (чтоб не искать поиском):

https://www.mql5.com/ru/forum/3555/page3#comment_57315 

Ограничение кеша индикатора.
Ограничение кеша индикатора.
  • www.mql5.com
Но вот нет никакой возможности ограничить автоматическую загрузку данных в кеш индикатора.
 

Вопрос. Оператор new. В Справочнике сказано, что new - это оператор; при этом в примерах зачастую после использования данного оператора делается проверка на равенство константе NULL. Например:

//+------------------------------------------------------------------+
//| Создание фигуры                                                  |
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
  {
   m_ypos=HORZ_BORDER;
//--- случайным образом создаём одну из 7 возможных фигур
   int nshape=rand()%7;
   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }
//--- отрисовываем
   if(m_shape!=NULL)
     {
      //--- начальные установки
      m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
      m_shape.SetYPos(m_ypos);
      m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
      //--- отрисуем
      m_shape.Draw();
     }
//---
  }

 Также говорится, что "NULL можно сравнивать с указателями на объекты, созданные при помощи оператора  new".

Получается, что оператор new не всегда создаёт новый объект? Или же проверка на равенство NULL'ю созданного объекта - это особенность стиля того или иного программиста, и не является обязательной?

 
Yedelkin:

Вопрос. Оператор new. В Справочнике сказано, что new - это оператор; при этом в примерах зачастую после использования данного оператора делается проверка на равенство константе NULL. Например:

 Также говорится, что "NULL можно сравнивать с указателями на объекты, созданные при помощи оператора  new".

Получается, что оператор new не всегда создаёт новый объект? Или же проверка на равенство NULL'ю созданного объекта - это особенность стиля того или иного программиста, и не является обязательной?

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

Это правильно. Но в примерах из Справочника проверка осуществляется сразу после создания объекта, т.е. в одном месте программы и в пределах одной функции. И приведённое правило здесь не совсем в точку. Зачем осуществлять проверку сразу после создания объекта? Получается, что оператор new не всегда создаёт новый объект? =(повторяюсь)=

Вот ещё один пример из многих:

//--- example for CArrayString::Add(string)
#include <Arrays\ArrayString.mqh>
//---
void OnStart()
  {
   CArrayString *array=new CArrayString;
   //---
   if(array==NULL)
     {
      printf("Object create error");
      return;
     } 
 
Yedelkin:

Это правильно. Но в примерах из Справочника проверка осуществляется сразу после создания объекта, т.е. в одном месте программы и в пределах одной функции. И приведённое правило здесь не применимо. Зачем осуществлять проверку сразу после создания объекта? Получается, что оператор new не всегда создаёт новый объект (повторяюсь)?

Вот ещё один пример из многих:

Есть такая вероятность. В справке первый абзац.
 
Lizar:
Есть такая вероятность. В справке первый абзац.
ОК. Получается, что у оператора поведение - как у функции. Может создать, а может и не создать.
 
Yedelkin:
ОК. Получается, что у оператора поведение - как у функции. Может создать, а может и не создать.
Например, не хватило памяти под объект.
 
Rosh:
Например, не хватило памяти под объект.
Вот иногда простое объяснение помогает значительно расширить кругозор. Спасибо!
 

Вопрос. Можно ли после объявления в родительском классе виртуальной функции с определённым набором параметров и их типов изменять  в классах-потомках количество и типы параметров у соответствующих виртуальных функций?

С одной стороны, в Справочнике говорится, что "виртуальная функция может замещаться в производном классе. Выбор того, какое определение функции вызвать для виртуальной функции, происходит динамически (на этапе выполнения). Типичный случай – когда базовый класс содержит, а производные классы имеют свои версии этой функции". С другой стороны, приведённые в Справочнике примеры касаются случаев, когда у виртуальных функций различаются тела определения функций, а не заголовки определения функций.

 
Yedelkin:

Вопрос. Можно ли после объявления в родительском классе виртуальной функции с определённым набором параметров и их типов изменять  в классах-потомках количество и типы параметров у соответствующих виртуальных функций?

Только точная копия определения, за исключением параметров по умолчанию (умолчания могут отличаться, но лучше это не использовать)
Причина обращения: