#ооп #архитектура #qt #cpp
Есть реализация класса Figure: #include "figure.h" Figure::Figure(QPoint coord,QString name,QRect rect,QString color,QObject *parent) : QObject(parent) { this->name=name; this->color=color; QPixmap img2("C:/Documents and Settings/Denis/QTProjects/chess/spatial.png"); this->_img=img2.copy(rect); } void Figure::isMoveTo(QPoint from,QPoint to) { //данная функция виртуальная } И есть класс FigureList (список всех фигур): QList
Ответы
Ответ 1
Я бы сделал по-другому. Это не дело фигуры — знать, где расположены другие фигуры. Фигура должна уметь ответить на вопрос: может ли она потенциально перейти на данное поле? перейти на данное поле со взятием? И какие поля при этом будут пройдены. (Различие между переходом и взятием актуально для пешек, например.) А вот уже внешняя по отношению к фигуре логика должна определить, что за фигура стоит на целевом поле, своя/чужая, нет ли на проходимых полях других фигур и т. п. Обратите внимание на специальный случай взятия на проходе (снимается фигура, не стоящая на целевом поле) и рокировки (двигаются две фигуры). Кстати, на английском шахматная фигура называется piece, так что я бы переназвал класс. И ещё: я бы разделил логику фигуры (определяющую, куда фигура может пойти и каков номер поля, на котором она находится) от представления фигуры (определяющего, какая картинка представляет фигуру на экране, и каковы координаты прямоугольника на экране, где она изображается). Это два очевидно разных класса с очевидно разными областями ответственности.Ответ 2
Вариант 1) Функция isMoveTo перемещается в FigureList. Это решает часть проблем. Конечно, придется много переписать. Вариант 2) Создается специальный класс, который наследует FigureList. У каждого Figure есть ссылка на этот специальный класс. Так как Figure создается классом FigureList, то никто не мешает ему передать this - то есть ссылку на себя. Это конечно сделает циклические ссылки, но при правильном подходе будет нормально. (при желании можно прикрутить smart_pointer + weak_pointer).
Комментариев нет:
Отправить комментарий