0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 8
|
||||||||||||||||
1 | ||||||||||||||||
Изменение вектора родителя через наследников22.10.2015, 21:23. Показов 2618. Ответов 5
Метки нет Все метки)
(
В общем, думала, куда написать... Решила все же сюда.
В данный момент нужно, чтобы программа расставляла, скажем так, шахматные фигуры на поле. Есть родитель-поле, абстрактный класс фигура, и два наследника, от нее и от поля - еще два класса-фигуры. Хочу через наследников поменять значения вектора в родителе, но там ничего не фиксируется. Если вызывать метод печати через одного из наследников, то в вектор запишется только то, что задал ему именно этот наследник - второй будет проигнорирован, ну, что логично. Как можно сделать так, чтобы наследники меняли вектор, как этого хочу я? Чтобы все фигуры были на поле? Буду благодарна за любые ответы. chess.h
0
|
22.10.2015, 21:23 | |
Ответы с готовыми решениями:
5
Вывод полей наследников через foreach из List Изменение родителя в Qt Designer |
202 / 138 / 88
Регистрация: 21.12.2014
Сообщений: 369
|
|
22.10.2015, 22:40 | 2 |
Судя по твоему коду, каждая фигура содержит в себе поле. А поле содержит левый вектор векторов. Поле должно быть одно и должно содержать фигуры. Наследование фигуры от поля тут совершенно не нужно. Абстрактный класс тут для вида только, надо поместить в него общие для всех фигур свойства - координаты например. И вектор фигур поместить в поле.
1
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
|
22.10.2015, 23:16 | 3 |
Shinichi, Здравствуйте, судя по всему Вы не правильно используете в своей программе наследование. 3 момента:
1) Наследование реализует взаимосвязь между сущностями типа "является" - Иерархия типа House -> Building -> Object - можно читать как - Любой дом является строением, любое строение является объектом (у наследования есть свойство транзитивности) любой дом является объектом. Если так прочесть Ваш код, то получится, что Bishop является фигурой (что вполне корректно), но при этом Бишоп является полем (FieldGeneration). Т.е. фигура, содержит в себе все свойства целой доски - это не верно. 2) Наследование реализации (наследование от не полностью абстрактного класса) позволяет получить и использовать весь код, который был написан в базовом в классе, в классе наследнике. "Отказ от наследства" (Refused Bequest) - т.е. намеренное не использование кода базового класса в наследнике - является известным "запахом кода" - которого следует избегать. (Подробнее читайте в Фаулер М., Бек К., Брант Д., Робертс Д., Апдайк У. Рефакторинг: улучшение существующего кода) В Вашем коде - каждая фигура получила бы код FieldGeneration - но явно они не стали бы его использовать целиком. 3) Множественное наследование - позволяет наследовать класс сразу от нескольких классов. Это мощный инструмент, позволяющий, например, один объект интерпретировать двумя различными образами (Вася Пупкин - с одной стороны - студент, с другой стороны - музыкант). Множественное наследование реализаций - с одной стороны, позволяет получить не только интерфейс, но и поведение наследованных классов. Но множественное наследование сопряжено со специфическими проблемами (Подробнее читайте "deadly diamond of death"). В общем случае - не обоснованное множественное наследование реализаций как минимум - ухудшит структуру программы (повышенная связанность, побочные эффекты модификаций), и быстродействие (особенно в случае виртуального наследования). В Вашем случае множественное наследование не оправдано. Общие советы - использовать композицию вместо наследования. Композиция предполагает отношение часть - целое. Т.е. доска состоит из ячеек. В каждой ячейке могут быть фигуры. В зависимости от типа фигуры может быть получено разное значение ходов для фигуры. В общем случае фигуры не должны будут расставлять другие фигуры по полю, более того - в идеале один тип фигур не должен знать о другом типе фигур. Типы фигур не должны быть заданы жестко - а образовывать иерархию - Конкретная Фигура -> Фигура (Шашка -> Фигура). И полиморфно реализовывать методы взаимодействия с фигурой.
1
|
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 8
|
|
22.10.2015, 23:40 [ТС] | 4 |
Единственное, что значит "вектор фигур поместить в поле"?
Добавлено через 10 минут Спасибо за развернутый ответ. ![]() Вариант два - поле получало бы координаты фигур через сеттеры\геттеры и обновляло его, а две фигуры, в моем случае - ладья и слон - хранили бы свои координаты. Сейчас буду пробовать это все делать. Чую, и здесь глупость сказанула. ![]()
0
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
||||||
23.10.2015, 00:49 | 5 | |||||
![]() Решение
Shinichi,
Не по теме: Я в данный момент пишу для Вас пример моего видения данного решения, мы с Вами потом сможем развернуто обсудить его. Добавлено через 36 минут Итак, код: Кликните здесь для просмотра всего текста
Пруф работоспособности: http://ideone.com/FPPSar Прошу строго не судить. Я полностью убрал на данный момент ограничения на перестановку фигур (оставил заглушки с todo). Кроме того, в зависимости от накладываемых требований на функционал - возможно потребуется доработка иерархий и отношений сущностей. Например чтобы суметь взяться за Фигуру - и поставить её в позицию - нужно научить фигуру определять в какой позиции она сейчас находится ( а для этого, возможно, её придется подружить с Cell, а Cell научить понимать свою позицию). Вариантов тут масса, это просто пример рабочий как иллюстрация возможностей реализации через композицию. Добавлено через 3 минуты При реализации использован стандарт языка с++11. Добавлено через 9 минут Основные идеи - хоть на доске и располагаются все фигуры - она не отвечает за их время жизни (хотя можно использовать и обратный подход). Мы можем установить фигуру на позицию в доске, можем убрать фигуру с позиции доски. Можем передвинуть фигуру (композиция снятия и установки). Доска не знает какая конкретная фигура установлена в ячейке доски. Фигура, ячейка, доска - имеют методы текстового представления своей сущности (для фигуры - просто символ, для ячейки - символ ячейки - если ячейка пуста и символ фигуры если в ячейку установлена фигура, для доски - символы всех ячеек из которых она состоит в отформатированном виде). Символ для фигуры получается из виртуального метода - что позволяет полиморфно менять его от фигуры к фигуре. (Хотя можно было сделать базовый класс, в который мы устанавливаем этот символ как строку - и он её отображает - вот оно многообразие реализаций). Далее текстовое представление может быть отображено (например в поток вывода). В нашем случае информацию для отображения содержит std::string - в общем случае это был бы отдельный абстрактный тип данных. (набор координат, картинка, или целая 3д модель). Добавлено через 12 минут Из мыслей пришедших на ум в последний момент: В моей реализации доска является гарантом соблюдения игровых правил. (Если не считать доступность метода SetFigure) - по крайней мере moveFigure - защищает от нечестных с точки зрения игровых правил действий. Но в целом имело бы смысл разнести данную доску на 2 разные сущности - доска и игра (Game) - в игре были бы методы связанные с игровой логикой - а доска осталось бы для презентации игровой доски и не более - позволяющей делать с собой что угодно (В реальности же доска тебя не накажет за то что ты пешкой начал ходить как ферзём). Это в частности позволило бы с одной и той же доской и фигурами играть в разные игры (Шахматы и шашки например). Еще одна мысль - игре понадобится отслеживать состояние доски потому-что, например, да фигура может походить по диагонали... но что она не может перепрыгнуть через другие фигуры, стоящие на её пути - скажет только игра, обладающая знаниями о том, что находится на пути следования фигуры. Добавлено через 3 минуты Еще один момент - фигурам нужно будет присвоить принадлежность к сторонам (белые, черные) - и дописать логику замены фигур на доске. (Например, если белая пешка наехала на поле с белым же ферзем - пользователю должно написать, что так ходить нельзя) А вот если белая пешка попала на поле с черным ферзем - она его съедает - поле занимается пешкой, ферзь удаляется, пользователю записывают счет. Кроме того нужно было бы добавить контроль последовательности ходов и сущность игрока. Т.е. на верхнем уровне были бы написаны строки, позволяющие ходить по очереди игроку белых и игроку черных, при этом, если игрок белых пытается взять фигуру черных - он получает сообщение об ошибке, что мол не твоё - не трожЪ).
1
|
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 8
|
|
23.10.2015, 01:20 [ТС] | 6 |
Cпасибо огромное. Буду разбираться, дописывать.
![]() Не передам Вам, как Вы помогли.
0
|
23.10.2015, 01:20 | ||||||
Помогаю со студенческими работами здесь
6
ООП - изменение переменной родителя Изменение вектора. Наибольший элемент вектора
Пропорциональное изменение размеров div (от родителя до всех вложенных)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
![]() |
Новые блоги и статьи
![]() |
||||
Лучшие практики оптимизации Docker Image
Mr. Docker 13.03.2025
Размер Docker-образа влияет на множество аспектов работы с контейнерами. Чем больше образ, тем дольше его загрузка в реестр и выгрузка из него. Для команд разработки, работающих с CI/ CD пайплайнами,. . .
|
Вопросы на собеседовании по Docker
Mr. Docker 13.03.2025
Ты сидишь напротив технического специалиста, и вдруг звучит вопрос про Docker Swarm или многоэтапные сборки. Пот на лбу? Не переживай, после этой статьи ты будешь готов ко всему! Эта статья будет. . .
|
Поиск текста в сносках : замена дефиса на тире или тире на дефис...
РоΜа 13.03.2025
Нужно было найти текст в сносках и заменить. Почему-то метод селекшн не сработал. . . пришлось гуглить. найденный на форумвба код пришлось править. Смысл - заменяет в сносках дефисы и тире на нужные. . . .
|
Real PATH definitions in bash scripts
jigi33 13.03.2025
Как поймать путь и путь к директории относительно запускаемого файла в BASH
1. поймать путь через вывод $(pwd)
2. более правильно - на основе realpath (см. скриншот)
|
Django или Flask: что выбрать для веб-разработки на Python
py-thonny 13.03.2025
Django – это высокоуровневый фреймворк, который придерживается философии "всё включено". Он предоставляет разработчику готовые решения для большинства типичных задач веб-разработки: от аутентификации. . .
|
Непрерывное развертывание в Java с Kubernetes
Javaican 13.03.2025
Чем так привлекателен Kubernetes для развертывания Java-приложений? Этот оркестратор контейнеров позволяет автоматизировать развертывание, масштабирование и управление контейнеризированными. . .
|
Предотвращение XSS, CSRF и SQL-инъекций в JavaScript
run.dev 13.03.2025
JavaScript занимает первые позиции среди языков веб-разработки, но его распространенность делает его привлекательной целью для злоумышленников. Межсайтовый скриптинг (XSS), межсайтовая подделка. . .
|
PHP 8: JIT-компиляция и улучшение производительности
Jason-Webb 13.03.2025
PHP никогда не славился своей скоростью. Многие сталкивались с проблемами производительности при работе со сложными вычислениями или обработкой больших объемов данных. Традиционная модель выполнения. . .
|
Сериализация данных с Apache Avro в Kafka
Javaican 12.03.2025
Apache Kafka стала одним из ключевых решений для работы с большими потоками данных. Однако с ростом объемов передаваемых данных возникает проблема: как эффективно сериализовать и десериализовать. . .
|
Создание потребителей Kafka с помощью Reactor Kafka
Javaican 12.03.2025
Reactor Kafka — это библиотека, объединяющая Apache Kafka с реактивным программированием на базе Project Reactor. Такое сочетание позволяет строить неблокирующие, асинхронные приложения с контролем. . .
|