Есть реализация класса 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
При вызовы функции Figure->isMoveTo(QPoint(1,1),QPoint(1,2)) мы по координатам в
списке должны получать тип фигуры,то есть класс Figure должен иметь доступ к FigureList.
Как это реализовать?
Ответы
Ответ 1
Я бы сделал по-другому. Это не дело фигуры — знать, где расположены другие фигуры.
Фигура должна уметь ответить на вопрос: может ли она потенциально
перейти на данное поле?
перейти на данное поле со взятием?
И какие поля при этом будут пройдены.
(Различие между переходом и взятием актуально для пешек, например.)
А вот уже внешняя по отношению к фигуре логика должна определить, что за фигура стоит
на целевом поле, своя/чужая, нет ли на проходимых полях других фигур и т. п.
Обратите внимание на специальный случай взятия на проходе (снимается фигура, не стоящая
на целевом поле) и рокировки (двигаются две фигуры).
Кстати, на английском шахматная фигура называется piece, так что я бы переназвал класс.
И ещё: я бы разделил логику фигуры (определяющую, куда фигура может пойти и каков
номер поля, на котором она находится) от представления фигуры (определяющего, какая
картинка представляет фигуру на экране, и каковы координаты прямоугольника на экране,
где она изображается). Это два очевидно разных класса с очевидно разными областями
ответственности.
Ответ 2
Вариант 1)
Функция isMoveTo перемещается в FigureList. Это решает часть проблем. Конечно, придется
много переписать.
Вариант 2)
Создается специальный класс, который наследует FigureList. У каждого Figure есть
ссылка на этот специальный класс. Так как Figure создается классом FigureList, то никто
не мешает ему передать this - то есть ссылку на себя. Это конечно сделает циклические
ссылки, но при правильном подходе будет нормально. (при желании можно прикрутить smart_pointer
+ weak_pointer).
Комментариев нет:
Отправить комментарий