Ошибки, баги, вопросы - страница 2359

 
A100:

Специально для Вас перепроверил с учётом

Все нормально DJ

Какой компилятор у вас?

У меня на VS 2010:

binary '=' : no operator found which takes a right-hand operand of type 'A' (or there is no acceptable conversion)

p.s. Я только не очень понял, что значит "с учётом"?   Речь шла о допустимости неявного копирования базового класса в производный.

 

В Visual Studio мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.

Написал на всякий случай, чтобы при запрете нервного явное заодно не запретили бы случайно

 
A100:

В Visual Studio мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.

О явном операторе не шла речь.  Я говорил о недопустимости неявного оператора в данном случае, которую вы назвали "узостью мышления", а это не так.

Если требуется провести копирование, то в C++ нужно сначала явно кастить b к нужному типу.   Ибо такое копирование - это нарушение инкапсуляции объекта. Поэтому ни о какой неявности речи быть не должно.

 
A100:

Я имел ввиду явный оператор копирования и пояснил это кодом.

Кстати, если класс A тоже унаследован от какого-то класса X, то ваш класс B никак не защищён от копирования X (говорим о MQL).  Вам придётся прописывать операторы ВСЕХ родительских классов.
 
A100:

Сомневаюсь, что компилятор разделяет их (в контексте кода) на явные и неявные. Иначе это исправить было бы просто

Суть в том, что неявный оператор всегда соответствует типу объекта.  Т.е. если объект типа B, то и неявный оператор у него с типом const B&.  Тип A он не принимает.  Но это в C++.
 

Кстати, с типом оператора, похоже, как раз таки все нормально

Сначала он ищет оператор В::, если его нет, тогда уже ищет в А::, если и там нет, тогда считает свой долг выполненным и ничего не делает (хотя указатель в итоге битый) :)

 
Ilya Malev:

если и там нет, тогда считает свой долг выполненным и ничего не делает (хотя указатель в итоге битый) :)

Почему ничего не делает? Он копирует неявным (автоматическим) оператором operator=(const A&), чего делать не должен.

Да и уберите вы наконец эту звёздочку после B, глаз режет )  С этим багом то уже всё выяснили.

 
Alexey Navoykov:

Да и уберите вы наконец эту звёздочку после B, глаз режет )  С этим багом то уже всё выяснили.

Лично мне объектные переменные без звездочки глаз режут )) Одна из противных ошибок - написать A a=new A вместо *а  и долго не понимать в чем дело) Я наоборот показал, что все работает правильно, если последовать Вашему совету и объявить приватный оп.=&. И в этом случае тогда редактор сразу выдаст ошибку. Буду теперь так делать всегда ))

 
Несколько часов потратил на поиск расхождений. Нашел такое
#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  const double Koef =  0.25;
  const int iDelta = 32;
  const double point = 0.00001;
  
  const double high = 1.06736;
  const double low = 1.06676;
  
  const double Avg = (high + low) * 0.5;  
  const double Size = (high - low) * Koef * 0.5;  
  
  PRINT(DoubleToString(Avg - Size - point * iDelta, 5));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT(DoubleToString(Avg - (Size + point * iDelta), 5)); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


Особенности double знаю, но не такие, что если поменять порядок сложения (за исключением относительно сильно отличных чисел), то результат будет разный! Просьба объяснить глупцу, из-за чего здесь такое происходит?

В исходнике нужно смотреть только на две нижние строки.

 

Ошибка для разработчиков.

Скрипт не компилируется, определите почему))). Используйте прикрепленный файл.


Этот же файл:


Файлы:
Test1.mq5  9 kb