Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Конечно:
Понял, что проблема заключается в том, как правильно заполнить массив shapes[10] экземплярами классов, производных от CShape. Предложенный мною вариант почему-то не работает. Давайте думать.
Массив должен иметь тип указателей на классы, а не тип самого класса.
Тогда можно применять оператор new.
Массив должен иметь тип указателей на классы, а не тип самого класса.
Тогда можно применять оператор new.
Можно пример?
Просто приведенный мной пример взят из документации и не понятно как он должен работать...
Понял, что проблема заключается в том, как правильно заполнить массив shapes[10] экземплярами классов, производных от CShape. Предложенный мною вариант почему-то не работает. Давайте думать.
Думай, не думай, 100 рублей не деньги.
Пример глючный на все 100, да и подобная реализация или не продумана или не доделана до конца.
Результаты своих экспериментов в коде приводить не буду, дам тока выводы, а он таковы:
1. Если объявить объекты не классами а структурами они спокойно укладываются в массив. Только при этом вируальность придется убрать и появляется возможность работы только с функционалом того типа объектов какой у массива (в данном случае базовый класс);
2. Можно объявить как как указатели, тогда также можно сформировать массив.Но и тут возникают проблемы:
а) при при отсутствии чистки указателей появляется утечка памяти;
б) также невозможно нормально работать с функционалом потомков.
PS
Верней так - функционал который был объявлен в базовом классе доступен, при этом виден и у потомков, а вот все что появилось у самих потомков недоступно.
Массив должен иметь тип указателей на классы, а не тип самого класса.
Тогда можно применять оператор new.
Да, я тоже думал в этом направлении, насчёт использования указателей. НО тогда не выполняются условия из документации:
"Для квадрата (класс CSquare) площадь вычисляется через стороны, для круга (класс CCircle) площадь выражается через радиус и так далее. Мы можем создать массив для хранения объектов типа CShape, в котором можно будет хранить как объект базового класса, так и всех его потомков. В дальнейшем мы можем вызывать одну и ту же функцию для любого элемента данного массива.
...Так как для вычисления площади квадрата и круга требуются соответствующие значения членов m_radius и m_square_side, то в объявлении соответствующего класса мы добавили функции SetRadius и SetSide(). Теперь мы можем объявить массив типа Shape и заполнить его объектами производных классов..."
Массив должен иметь тип указателей на классы, а не тип самого класса.
Тогда можно применять оператор new.
Yedelkin:
...Так как для вычисления площади квадрата и круга требуются соответствующие значения членов m_radius и m_square_side, то в объявлении соответствующего класса мы добавили функции SetRadius и SetSide(). Теперь мы можем объявить массив типа Shape и заполнить его объектами производных классов..."
Вся фишка в том что если массив имеет тип базового класса не выходит получиь доступ к функционалу потомков. т.е. SetRadius() и SetSide() становятся не доступны.
Поэтому пока вижу три варианта:
1. массив должен быть однородным (по возможности);
2. Я чего-то не понимаю в философии и архитектуре ООП для MQL5;
3. разработчики либо превери нерабочий примерЮ либо не дожали вопрос до конца.>
Не прокатит нормально. Хотя массив сформирует.
Верней так - функционал который был объявлен в базовом классе доступен, при этом виден и у потомков, а вот все что появилось у самих потомков недоступно.
Во-во, именно с этим и столкнулся.
Пример глючный на все 100 ...
Получается, что необходим ответ авторов Справочника на эту тему.
Не прокатит нормально. Хотя массив сформирует.
Вся фишка в том что если массив имеет тип базового класса не выходит получиь доступ к функционалу потомков. т.е. SetRadius() и SetSide() становятся не доступны.
Поэтому пока вижу три варианта:
1. массив должен быть однородным (по возможности);
2. Я чего-то не понимаю в философии и архитектуре ООП для MQL5;
3. разработчики либо превери нерабочий примерЮ либо не дожали вопрос до конца.>
Выполняйте:
можно сделать намного проще... виртуализацией:
Что значит нормально не прокатит?
1. Функционал потомков не доступен. Не знаю кто и как, но лично я доступ к SetRadius() и SetSide() из Массива так и не получил.Может там есть путь как проблему решить автогеном, но хочется без этого.
2. Может я с указателями не так работаю, но у меня либо утечка вылазит постоянно либо приходится бить указатели сразу в том блоке где идет основная работа.