Вопрос. Оператор new. В Справочнике сказано, что new - это оператор; при этом в примерах зачастую после использования данного оператора делается проверка на равенство константе NULL. Например:
//+------------------------------------------------------------------+//| Создание фигуры |//+------------------------------------------------------------------+void CTetrisField::NewShape()
{
m_ypos=HORZ_BORDER;
//--- случайным образом создаём одну из 7 возможных фигурint nshape=rand()%7;
switch(nshape)
{
case0: m_shape=new CTetrisShape1; break;
case1: m_shape=new CTetrisShape2; break;
case2: m_shape=new CTetrisShape3; break;
case3: m_shape=new CTetrisShape4; break;
case4: m_shape=new CTetrisShape5; break;
case5: m_shape=new CTetrisShape6; break;
case6: 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'ю созданного объекта - это особенность стиля того или иного программиста, и не является обязательной?
Вопрос. Оператор new. В Справочнике сказано, что new - это оператор; при этом в примерах зачастую после использования данного оператора делается проверка на равенство константе NULL. Например:
Также говорится, что "NULL можно сравнивать с указателями на объекты, созданные при помощи оператора new".
Получается, что оператор new не всегда создаёт новый объект? Или же проверка на равенство NULL'ю созданного объекта - это особенность стиля того или иного программиста, и не является обязательной?
Если вы в одном месте программы создаёте динамичный объект то логично что в другом месте вы будете его уничтожать, и не факт что это всё находится в пределах одной функции, отсюда простое правило перед использованием указателя проверьте а есть ли он.
Urain: Если вы в одном месте программы создаёте динамичный объект то логично что в другом месте вы будете его уничтожать, и не факт что это всё находится в пределах одной функции, отсюда простое правило перед использованием указателя проверьте а есть ли он.
Это правильно. Но в примерах из Справочника проверка осуществляется сразу после создания объекта, т.е. в одном месте программы и в пределах одной функции. И приведённое правило здесь не совсем в точку. Зачем осуществлять проверку сразу после создания объекта? Получается, что оператор new не всегда создаёт новый объект? =(повторяюсь)=
Вот ещё один пример из многих:
//--- example for CArrayString::Add(string)#include <Arrays\ArrayString.mqh>//---voidOnStart()
{
CArrayString *array=new CArrayString;
//---if(array==NULL)
{
printf("Object create error");
return;
}
Это правильно. Но в примерах из Справочника проверка осуществляется сразу после создания объекта, т.е. в одном месте программы и в пределах одной функции. И приведённое правило здесь не применимо. Зачем осуществлять проверку сразу после создания объекта? Получается, что оператор new не всегда создаёт новый объект (повторяюсь)?
Вопрос. Можно ли после объявления в родительском классе виртуальной функции с определённым набором параметров и их типов изменять в классах-потомках количество и типы параметров у соответствующих виртуальных функций?
С одной стороны, в Справочнике говорится, что "виртуальная функция может замещаться в производном классе. Выбор того, какое определение функции вызвать для виртуальной функции, происходит динамически (на этапе выполнения). Типичный случай – когда базовый класс содержит, а производные классы имеют свои версии этой функции". С другой стороны, приведённые в Справочнике примеры касаются случаев, когда у виртуальных функций различаются тела определения функций, а не заголовки определения функций.
Вопрос. Можно ли после объявления в родительском классе виртуальной функции с определённым набором параметров и их типов изменять в классах-потомках количество и типы параметров у соответствующих виртуальных функций?
Только точная копия определения, за исключением параметров по умолчанию (умолчания могут отличаться, но лучше это не использовать)
Техническая ссылка. Пример "механизма оборачивания" при работе с классами (чтоб не искать поиском):
https://www.mql5.com/ru/forum/3555/page3#comment_57315
Вопрос. Оператор new. В Справочнике сказано, что new - это оператор; при этом в примерах зачастую после использования данного оператора делается проверка на равенство константе NULL. Например:
Также говорится, что "NULL можно сравнивать с указателями на объекты, созданные при помощи оператора new".
Получается, что оператор new не всегда создаёт новый объект? Или же проверка на равенство NULL'ю созданного объекта - это особенность стиля того или иного программиста, и не является обязательной?
Вопрос. Оператор new. В Справочнике сказано, что new - это оператор; при этом в примерах зачастую после использования данного оператора делается проверка на равенство константе NULL. Например:
Также говорится, что "NULL можно сравнивать с указателями на объекты, созданные при помощи оператора new".
Получается, что оператор new не всегда создаёт новый объект? Или же проверка на равенство NULL'ю созданного объекта - это особенность стиля того или иного программиста, и не является обязательной?
Если вы в одном месте программы создаёте динамичный объект то логично что в другом месте вы будете его уничтожать, и не факт что это всё находится в пределах одной функции, отсюда простое правило перед использованием указателя проверьте а есть ли он.
Это правильно. Но в примерах из Справочника проверка осуществляется сразу после создания объекта, т.е. в одном месте программы и в пределах одной функции. И приведённое правило здесь не совсем в точку. Зачем осуществлять проверку сразу после создания объекта? Получается, что оператор new не всегда создаёт новый объект? =(повторяюсь)=
Вот ещё один пример из многих:
Это правильно. Но в примерах из Справочника проверка осуществляется сразу после создания объекта, т.е. в одном месте программы и в пределах одной функции. И приведённое правило здесь не применимо. Зачем осуществлять проверку сразу после создания объекта? Получается, что оператор new не всегда создаёт новый объект (повторяюсь)?
Вот ещё один пример из многих:
Есть такая вероятность. В справке первый абзац.
ОК. Получается, что у оператора поведение - как у функции. Может создать, а может и не создать.
Например, не хватило памяти под объект.
Вопрос. Можно ли после объявления в родительском классе виртуальной функции с определённым набором параметров и их типов изменять в классах-потомках количество и типы параметров у соответствующих виртуальных функций?
С одной стороны, в Справочнике говорится, что "виртуальная функция может замещаться в производном классе. Выбор того, какое определение функции вызвать для виртуальной функции, происходит динамически (на этапе выполнения). Типичный случай – когда базовый класс содержит, а производные классы имеют свои версии этой функции". С другой стороны, приведённые в Справочнике примеры касаются случаев, когда у виртуальных функций различаются тела определения функций, а не заголовки определения функций.
Вопрос. Можно ли после объявления в родительском классе виртуальной функции с определённым набором параметров и их типов изменять в классах-потомках количество и типы параметров у соответствующих виртуальных функций?