Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да не вызовешь его никак. Чистая утечка памяти.
Делайте так, что бы можно было вызывать.
Кстати, господа разработчики, тут все таки лучше поправить. Как никак new действительно возвращает указатель, поэтому добавьте проверку, что на другом конце = тоже указатель, уберите здесь неявное приведение (А) new A();, как я понял - именно это и происходит.
Кстати, господа разработчики, тут все таки лучше поправить. Как никак new действительно возвращает указатель, поэтому добавьте проверку, что на другом конце = тоже указатель, уберите здесь неявное приведение (А) new A();, как я понял - именно это и происходит.
Там идет вызов этого оператора
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MQL5 Компилятор не различает класс и указатель на него
fxsaber, 2019.01.10 06:36
С каких времен определены (вопрос разработчикам)
и как они работают? Следующий компилируемый код выглядит бредово
Грубо говоря, он выглядит так
Там идет вызов этого оператора
Грубо говоря, он выглядит так
Странная тема, однако. Прежде чем поднимать шум, неплохо было бы ознакомиться, что в MQL всю жизнь указатели неявно кастились к объектам (разыменовывались), это удобно и все к этому привыкли. Вместо трудночитаемых записей a()->b()->c()->d() можно писать в привычном ООП формате: a().b().c().d(), и меньше лишних преобразований делать в процессе передачи в функции. А теперь из-за чьего-то недовольства всё менять?
Странная тема, однако. Прежде чем поднимать шум, неплохо было бы ознакомиться, что в MQL всю жизнь указатели неявно кастились к объектам (разыменовывались), это удобно и все к этому привыкли. Вместо трудночитаемых записей a()->b()->c()->d() можно писать в привычном ООП формате: a().b().c().d(), и меньше лишних преобразований делать в процессе передачи в функции. А теперь из-за чьего-то недовольства всё менять?
Дело не в кастинге. Вы не вникли.
Если ориентироваться на заявленный прообраз MQL - С++.
В С++ оператор new возвращает указатель, соответственно, если m_A - массив объектов:
здесь была бы ошибка типа.
Вот эта строка пропускалась бы компилятором:
Но вызывала бы утечку памяти.
Было бы неплохо, если бы в MQL было такое же поведение.
Странная тема, однако. Прежде чем поднимать шум, неплохо было бы ознакомиться, что в MQL всю жизнь указатели неявно кастились к объектам (разыменовывались), это удобно и все к этому привыкли. Вместо трудночитаемых записей a()->b()->c()->d() можно писать в привычном ООП формате: a().b().c().d(), и меньше лишних преобразований делать в процессе передачи в функции. А теперь из-за чьего-то недовольства всё менять?
А если в деталях на простых примерах.
По итогу имеем
1. 'а' получает копию созданного объекта, указатель на созданный new объект теряется
2. что будет в 'a' если new не удстся создать объект/выделить память?
Второй случай (наоборот)
1. после выхода из функции, 'b' как локальный объект должен быть разрушен.
на что тогда будет ссылаться 'a'?
2. или всё таки сработает оператор копирования и 'b' будет скопирован по указателю 'a' ? а если 'a' не был до этого определен?
Второй случай (наоборот)
Тут наоборот - указатель a неявно кастится к объекту (разыменовывается), и затем к нему применятся оператор=. Вчера fxsaber также упоминал об этом.
И вот в этом случае я соглашусь, что такое поведение лучше запретить. Хоть по логике оно не противоречит правилам MQL (т.к. вызов оператора= равносилен вызову любого другого метода объекта), но это приводит к неоднозначности восприятия такого кода и трудноуловимым ошибкам. И это касается не только оператора=, но также == и !=, как минимум. А возможно и для других операторов нужно запретить такой кастинг. Потому как в C++ к операторам можно применять: +-<>[].
Короче вердикт такой: при применении к указателю операторов, которые в C++ разрешены для указателей, запретить неявный кастинг этого указателя к объекту. Соответственно в вышеприведённом примере будет ошибка компиляции.