Изменение возвращаемого лямбда-функцией значения
Есть класс Field
, который содержит вектор из экземпляров класса Cell
. Нужно для экземпляров класса Cell
менять значение поля Status
функцией ChangeStatus
.
Изменять значение поля нужно для элементов с известными координатами X
и Y
, для чего используется лямбда-функция find_if
.
Класс Cell
:
class Cell {
private:
int X;
int Y;
CellStatus Status;
public:
Cell(): X(0), Y(0), Status(CellStatus::Empty) {};
Cell(int newX, int newY, CellStatus newCS) : Cell()
{
X = newX;
Y = newY;
Status = newCS;
};
~Cell() {};
int getX() {return X;}
int getY() {return Y;}
CellStatus getStatus() {return Status;}
void ChangeStatus(CellStatus newCS)
{
Status = newCS;
};
Cell& operator= (Cell& otherCell) {
Status = otherCell.getStatus();
return *this;
}
};
Класс Field
:
class Field
{
private:
vector<Cell> cells;
public:
Field(){
//Создание элементов вектора cells - ячеек поля
for (int i = 1; i < 9; i++)
{
for (int j = 1; j < 9; j++)
{
if((i==4 && j == i) || (i==5 && j==5)) cells.push_back(Cell(j, i, White));
else if ((i == 4 && j == 5) || (i == 5 && j == 4)) cells.push_back(Cell(j, i, Black));
else cells.push_back(Cell(j, i, Empty));
}
}
};
~Field(){};
vector <Cell> getField() { return cells; }
Cell& getCellStatusByXY(int searchedX, int searchedY) //Узнать цвет ячейки по её координатам (для лямбда-функции)
{
auto foundC = find_if(cells.begin(), cells.end(), [&](Cell &c)
{
return (c.getX() == searchedX && c.getY() == searchedY);
});
return (*foundC);
}
void fillColorForArray(vector<Cell> cellsToSwap, CellStatus colorToSwap) //Заменить цвет ячеек, идентичных ячейкам из массива
{
for_each(cellsToSwap.begin(), cellsToSwap.end(), [&](Cell &cellNew) //Фишки, которым мы меняем цвет
{
auto foundCell = find_if(getField().begin(), getField().end(), [&](Cell cell) //Фишки, которые мы ищем
{
return (cell.getX() == cellNew.getX() && cell.getY() == cellNew.getY());
});
(*foundCell).ChangeStatus(CellStatus::Possible);
});
}
};
Пример использования лямбда-функции есть в классе Field
, в функции fillColorForArray
.
Проблема в том, что после выполнения функции меняется значение Status
у ячейки foundCell
, которую искали лямбда-функцией, а не элемент вектора cells
класса Field
.
Как это можно исправить? Поскольку в некоторых местах проекта впоследствии придётся таким образом использовать лямбда-функцию в лямбда-функции в лямбда-функции, есть вопрос: можно ли это сделать иначе?