Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь стать известным разработчиком? Выполняй заказы трейдеров в сервисе Фриланс!
hrenfx
3679
hrenfx 2015.08.01 15:37 
Проблема в том, что при перегрузке (не переопределении) оператора "=" зачем-то прекращает существовать соответствующий оператор разработчиков, который переопределить универсально невозможно.

Проще всего показать на примере:
#property strict

struct STRUCT
{
  int Tmp;

  const STRUCT operator -( void ) const
  {
//    const STRUCT Res = -this.Tmp;  // Не поможет предотвратить вызов оператора "=" в return
    STRUCT Res;

    Res.Tmp = -this.Tmp;

    return(Res); // здесь идет вызов оператора "=" из-за необходимости
                 // конверсии в const STRUCT,
                 // выделения памяти под const STRUCT
                 // и освобождение памяти от всех локальных переменных, включая Res
  }

  // Непонятное обязывание прописывания оператора, что итак определен разработчиками по-умолчанию
  // (иначе не получится перегрузить оператор приравнивания)!
  void operator =( const STRUCT &Value )
  {
//    this = Value;       // Коротко, но нельзя: бесконечная рекурсия. Нет Warning. !!!
    this.Tmp = Value.Tmp; // Длинно и не универсально: для каждого поля прописывать

    return;
  }

  // При перегрузке (не переопределении) оператора "=" прекращает существовать соответствующий оператор разработчиков
  void operator =( const int Value )
  {
    this.Tmp = Value;

    return;
  }
};

void OnStart( void )
{
  STRUCT Struct = 1;

  Print((-Struct).Tmp); // здесь вызывается не только унарный оператор "-", но и "=".

  return;
}
Это правильное поведение?
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий