
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Что я делаю не правильно?
Если бы прописали override, то узнали бы сразу во время компиляции, что ошиблись с сигнатурой виртуального метода.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2025.02.10 15:55
Ну и слово override, но здесь уже требуется знание ООП и опыт обжиганий в виде долгого поиска слома выполнения кода. А если бы использовался (там, где работает и без него) override, то не было бы долгого поиска, а сразу бы стало понятна причина, что произошло.
Если бы прописали override, то узнали бы сразу во время компиляции, что ошиблись с сигнатурой виртуального метода.
Да, согласен. Это упущено при многократных изменениях кода.
Разница в том, что при правильном написании
При записи перегруженная функция срабатывает, а при чтении нифига. Или наоборот, при записи не работает… Факт тот, что полностью не получается.
Там в коде ещё забаненые строки… Это неудавшиеся эксперименты.
//CArrayObj::Save(handle); list.Save(handle);
CArrayObj::Load(handle); //list.Load(handle);
А если при чтении писать list.Load(handle); то не отрабатывает виртуальная
Моей фантазии для экспериментов уже не хватает. А знаний никогда и не было…
Моей фантазии для экспериментов уже не хватает. А знаний никогда и не было…
Никогда не использовал CObject, поэтому для ответа на вопрос посмотрел исходник и сразу все понял.
Был уверен, что должны быть примеры использования. Но поиском не нашел.
Тот случай, когда Документация (глянул после исходников) дает понимания много меньше, чем чтение самих исходников.
В общем, 100% нужен пример-исходник в данном контексте Load/Save, чтобы стало понятнее ООП-новичку. Тут объяснять - дороже будет гораздо.
Да, согласен. Это упущено при многократных изменениях кода.
Разница в том, что при правильном написании
При записи перегруженная функция срабатывает, а при чтении нифига. Или наоборот, при записи не работает… Факт тот, что полностью не получается.
Там в коде ещё забаненые строки… Это неудавшиеся эксперименты.
А если при чтении писать list.Load(handle); то не отрабатывает виртуальная
Моей фантазии для экспериментов уже не хватает. А знаний никогда и не было…
Унаследуйся от CArrayObj и переопредели там метод CreateElement, чтобы он не возвращал NULL, а создавал нужный тебе тип объекта.
Так и унаследован от
Вот только понять не могу почему, в каком-то случае Type() не виртуалится, а в каком-то CreateElement() ………
В общем, 100% нужен пример-исходник в данном контексте Load/Save, чтобы стало понятнее ООП-новичку. Тут объяснять - дороже будет гораздо.
Ниже рабочий пример, где подсветил виртуальные функции.
Скрипт считывает историю в CArrayObj-объект, записывает ее в файл. Затем считывает ее из файла и распечатывает (для проверки корректности).
Ниже рабочий пример, где подсветил виртуальные функции.
Скрипт считывает историю в CArrayObj-объект, записывает ее в файл. Затем считывает ее из файла и распечатывает (для проверки корректности).
Спасибо. Но как и все ваши коды читать катастрофически сложно.
И всё-же виртуальная функция
в вашем коде используется из ArrayObj, а не перегруженная. Без перегрузки этой функции и так всё работает, а весь вопрос и был в том, чтобы была возможность изменять Type()
А вот CreateElement интересная реализация. В тех примерах, что я прочёл до попыток что-то сделать, как-то по другому. Завтра попробую разобраться.
Спасибо. Но как и все ваши коды читать катастрофически сложно.
Написал предельно просто. Альтернативный пример.
И всё-же виртуальная функция в вашем коде используется из ArrayObj, а не перегруженная. Без перегрузки этой функции и так всё работает, а весь вопрос и был в том, чтобы была возможность изменять Type()
Честно говоря, не вижу необходимости использовать эту идентификационную функцию. Но если нужно, то пропишите ее так.
Распечатка покажет, что вызывается именно эта функция.
Написал предельно просто. Альтернативный пример.
Честно говоря, не вижу необходимости использовать эту идентификационную функцию. Но если нужно, то пропишите ее так.
Распечатка покажет, что вызывается именно эта функция.
Большое спасибо за попытку помочь, но даже с переводчиком я прочесть не смогу. Так уж устроен мой старый мозг.
Острой необходимости в использовании этой идентификации нет. Просто интересно почему у меня в одном случае срабатывает, а в другом нет. В вашем коде работает, но понять мою ошибку у меня не получается.
На том, наверное, я и оставлю этот вопрос. Или может у кого-то получится пробить преграду в моём мозгу…
Ниже рабочий пример, где подсветил виртуальные функции.
Скрипт считывает историю в CArrayObj-объект, записывает ее в файл. Затем считывает ее из файла и распечатывает (для проверки корректности).
Всё-таки не могу успокоиться… Прошу объяснить:
Почему вы сделали два класса, один унаследованный от CObject
и второй унаследованный от CArrayObj
Ведь в CArrayObj тоже есть виртуальные функции Save() и Load() и по идее они должны\могут быть переопределены в классе потомке…
Почему не в одном классе всё это?