Получается, что вызов функции предка с = 0 превращается в вызов самого себя. Если эту ошибку ловить самостоятельно, то может быть и можно извлечь пользу...
Получаю ошибку компиляции: Error 1 error LNK2001: unresolved external symbol "public: virtual int __thiscall A::f2(void)"
Metaeditor же молчком. Нехорошо.
Алексей, объясните мне пожалуйста на пальцАх, почему, если mql является подобием С, то он обязательно должен быть абсолютно идентичным и шаг влево, шаг вправо - расстрел?
Только потому, что разработчики неосторожно так выразились? Но ведь любой язык построен на циклах и условиях. Всё остальное в прицепе. Почему-же никто не требует от каких-то других языков похожести в части ООП или ещё в чём-то на С.
Алексей, объясните мне пожалуйста на пальцАх, почему, если mql является подобием С, то он обязательно должен быть абсолютно идентичным и шаг влево, шаг вправо - расстрел?
Только потому, что разработчики неосторожно так выразились? Но ведь любой язык построен на циклах и условиях. Всё остальное в прицепе. Почему-же никто не требует от каких-то других языков похожести в части ООП или ещё в чём-то на С.
Речь не идёт о полной идентичности. Речь о том, что тот функционал, который реализован, должен работать корректно и непротиворечиво. Но вы сначала кричите, мол покажите мне другой язык, где работает по-другому. Мол предъявляйте им тоже претензии. А после того когда вам приводят в пример C++, в котором работает по-другому (правильно), то начинаете старую волынку, мол MQL - это не C++, он и не должен быть идентичным. Вы уж определитесь
А можете показать пример когда вот это всё может облегчить написание кода, сократить его или хотя-бы оградить от ошибки. И пожалуйста не абстрактными функциями, а максимально приближёнными к реалиям торговли, в советнике или индикаторе.
Да никак. Ребята просто пытаются свои фантазии натянуть на реальность.
Это да. Но я давно пользуюсь альтернативным вариантом: все интерфейсы изначально оформляю в виде промежуточного шаблонного класса:
Таким образом можно создавать цепочку наследования из любого числа таких интерфейсов. Да, конечно dynamic_cast с ними не сделаешь, но это не такая уж и частая необходимость. Главная задача - это передача в функции.
Почитал внимательнее, интересный у Вас ход, кстати. Я до такого не додумывался =) Поэкспериментирую тоже на досуге...
>> Да, конечно dynamic_cast с ними не сделаешь, но это не такая уж и частая необходимость. Главная задача - это передача в функции.
Да почему не делаешь, ноу проблем ) Но тогда появляется Ваш главный кошмар - невыявление ошибок кастинга на этапе компиляции :)
Да и это всё-равно бессмысленно в общем случае. Ведь цепочка наследования могла быть какая угодно: хоть Interface<CBase>, хоть Interface<C<B<A<CBase>>>>, вариантов немерено. Придётся CBase кастить последовательно ко всем возможным вариантам, что нереально.
Я помню собирался реализовать хранение информации об интерфейсах в самом объекте класса. И в дополнение к существующим интерфейсным прокладкам сделать самостоятельные интерфейсные классы, которые бы работали как обёртка над нашей прокладкой. Да только потом пришёл к выводу, что это всё лишнее и не нужное. Практической потребности кастить базовый класс к какому либо интерфейсу я не встречал. Это просто как-то нелогично. Единственный вариант - в отладочных целях узнать, поддерживает ли класс данный интерфейс, но для этого кастинг как таковой не нужен.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
У меня отреагировал "stack overflow" )
Видимо это тараканчик все таки...Так это не компилятор, а уже во время исполнения. А должен компилятор реагировать.
Вот попробовал в VS 2010 такой вариант:
Получаю ошибку компиляции: Error 1 error LNK2001: unresolved external symbol "public: virtual int __thiscall A::f2(void)"
А Metaeditor молчком. Нехорошо.
Так а должен компилятор реагировать.
Вот попробовал в VS 2010 такой вариант:
Получаю ошибку компиляции: Error 1 error LNK2001: unresolved external symbol "public: virtual int __thiscall A::f2(void)"
Metaeditor же молчком. Нехорошо.
Алексей, объясните мне пожалуйста на пальцАх, почему, если mql является подобием С, то он обязательно должен быть абсолютно идентичным и шаг влево, шаг вправо - расстрел?
Только потому, что разработчики неосторожно так выразились? Но ведь любой язык построен на циклах и условиях. Всё остальное в прицепе. Почему-же никто не требует от каких-то других языков похожести в части ООП или ещё в чём-то на С.
Алексей, объясните мне пожалуйста на пальцАх, почему, если mql является подобием С, то он обязательно должен быть абсолютно идентичным и шаг влево, шаг вправо - расстрел?
Только потому, что разработчики неосторожно так выразились? Но ведь любой язык построен на циклах и условиях. Всё остальное в прицепе. Почему-же никто не требует от каких-то других языков похожести в части ООП или ещё в чём-то на С.
А можете показать пример когда вот это всё может облегчить написание кода, сократить его или хотя-бы оградить от ошибки. И пожалуйста не абстрактными функциями, а максимально приближёнными к реалиям торговли, в советнике или индикаторе.
Да никак. Ребята просто пытаются свои фантазии натянуть на реальность.
Да никак. Ребята просто пытаются свои фантазии натянуть на реальность.
Это да. Но я давно пользуюсь альтернативным вариантом: все интерфейсы изначально оформляю в виде промежуточного шаблонного класса:
Таким образом можно создавать цепочку наследования из любого числа таких интерфейсов. Да, конечно dynamic_cast с ними не сделаешь, но это не такая уж и частая необходимость. Главная задача - это передача в функции.Почитал внимательнее, интересный у Вас ход, кстати. Я до такого не додумывался =) Поэкспериментирую тоже на досуге...
Как по мне, так очень даже полезное занятие- натягивать фантазии на реальность. В этом смысл развития!
И главное - плодотворная! Разработчики таки услышали нас и решили исправить этот баг, об который уже годами все спотыкаются.
А вот деструктивная позиция некоторых форумчан конечно удивляет. И сами не развиваются - и другим пытаются помешать с поразительной настойчивостью.
>> Да, конечно dynamic_cast с ними не сделаешь, но это не такая уж и частая необходимость. Главная задача - это передача в функции.
Да почему не делаешь, ноу проблем ) Но тогда появляется Ваш главный кошмар - невыявление ошибок кастинга на этапе компиляции :)
>> Да, конечно dynamic_cast с ними не сделаешь, но это не такая уж и частая необходимость. Главная задача - это передача в функции.
Да почему не делаешь, ноу проблем ) Но тогда появляется Ваш главный кошмар - невыявление ошибок кастинга на этапе компиляции :)
Да и это всё-равно бессмысленно в общем случае. Ведь цепочка наследования могла быть какая угодно: хоть Interface<CBase>, хоть Interface<C<B<A<CBase>>>>, вариантов немерено. Придётся CBase кастить последовательно ко всем возможным вариантам, что нереально.
Я помню собирался реализовать хранение информации об интерфейсах в самом объекте класса. И в дополнение к существующим интерфейсным прокладкам сделать самостоятельные интерфейсные классы, которые бы работали как обёртка над нашей прокладкой. Да только потом пришёл к выводу, что это всё лишнее и не нужное. Практической потребности кастить базовый класс к какому либо интерфейсу я не встречал. Это просто как-то нелогично. Единственный вариант - в отладочных целях узнать, поддерживает ли класс данный интерфейс, но для этого кастинг как таковой не нужен.