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

 

Столкнулся с такой проблемкой.  Нужно сравнивать два объекта одного класса между собой,  решил для удобства перегрузить оператор ==.  Оказалось, что если объекты динамические, то мой оператор не запускается, а вместо самих объектов сравниваются их указатели. Ну это в принципе логично, требуется операция перехода на сам объект по его указателю:   *a == *b.   А в MQL такую возможность сделать забыли. Нужно добавить.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Хотя я сейчас подумал, тот факт что здесь происходит сравнение указателей вместо самих объектов - это в корне неправильно, учитывая специфику языка.  Ведь MQL является управляемым языком, и само понятия "объект" здесь используется независимо от того, как объект расположен в памяти и как к нему осуществляется доступ. Обращение к членам и методам в любом случае идёт через точку. Т.е. тут всё также как в C#.  Соответственно и оператор сравнения должен работать одинаково как для статически выделенных объектов, так и для динамических.   А если нужно сравнить указатели, то это нужно делать используя GetPointer().

 
meat:

Хотя я сейчас подумал, тот факт что здесь происходит сравнение указателей вместо самих объектов - это в корне неправильно, учитывая специфику языка.

Не нужно в MQL придумывать правила сравнения противоречашие С++, до тех пор, пока есть возможность обойтись другими средствами. Если у Вас указатели, а Вам нужно сравнить объекты - используйте функцию сравнения
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
Одно дело предложить разрешить запись вида (*a == *b), и совсем другое дело - придать иной смысл записи (a == b)
 

При тестировании советника, выдает ошибку

invalid takeprofit for OrderSend function

OrderSend error 4107

Как можно исправить не влезая в код советника?

 
A100:
Не нужно в MQL придумывать правила сравнения противоречашие С++, до тех пор, пока есть возможность обойтись другими средствами. Если у Вас указатели, а Вам нужно сравнить объекты - используйте функцию сравненияОдно дело предложить разрешить запись вида (*a == *b), и совсем другое дело - придать иной смысл записи (a == b)

Так я же объясняю, что правила MQL и так противоречат С++.  Обращение к объекту по указателю тут осуществляется через точку, а должно быть через ->, если следовать правилам С++.

Т.е. в С++ "указатель" и "объект" - это два совершенно различных понятия, поэтому и синтаксис различный.  Всё строго. А здесь всё смешали в одну кучу. Выглядит будто мы обращаемся к свойствам и методам указателя. Я не говорю что это плохо. Это более удобно для ООП, так же сделано в C# например.  Но тогда нужно и всё остальное реализовывать в таком же ключе.  Должна быть единая концепция.  Иначе возникают противоречия и путаница:  в каких-то случаях мы используем указатель так же, как сам объект, а других случаях указатель вдруг оживает своей жизнью.

Если перейти к практической стороне всего этого, то мне уже пришлось столкнуться с проблемой. В коде использовались статические объекты.  Потом я решил заменить некоторые из них на динамические.  В итоге операции сравнения и присваивания стали работать совсем по другому. И эту проблему было сложно выявить, т.к. программа продолжает нормально компилироваться и работать, но не так, как надо.

 

У меня в коде имеется некий класс, в котором содержится некий объект:

CClass
{
  ...
  CObj  Object; 
  ...
};

Класс CObj объявлен перед этим. 

При попытки компиляции выдаётся ошибка:  'Object' - cannot be unset

Что означает эта ошибка и в чём может быть причина?  Не припомню чтобы раньше встречал такую ошибку.  Конструктор и деструктор у класса CObj имеются.

Попробовал объявить Object просто в виде переменной - всё ок. А вот в составе класса - не хочет.

 
Ну так что, кто-нибудь объяснит, что это за ошибка ("- cannot be unset") ?  В каких случаях она возникает?
 
meat:
Ну так что, кто-нибудь объяснит, что это за ошибка ("- cannot be unset") ?  В каких случаях она возникает?
Для данного объекта нельзя использовать функцию ZeroMemory
 
Zeleniy:

При тестировании советника, выдает ошибку

invalid takeprofit for OrderSend function

OrderSend error 4107

Как можно исправить не влезая в код советника?

в настройках попробуйте увеличить или уменьшить тейкпрофит
 
mql5:
Для данного объекта нельзя использовать функцию ZeroMemory

Ясно. Но почему компилятор показывает эту ошибку не в месте использования ZeroMemory, а в месте объявления класса?  Сбивает с толку. Я уже всю голову сломал, пытаясь понять в чём ошибка, и где находится.  Вы уж, пожалуйста, сделайте чтоб ошибка выдавалась в нужном месте.  Ведь например при копировании объекта, содержащего неразрешённые для копирования элементы, ошибка возникает именно в строчке с копированием, а не где-то внутри класса.