LINUX.ORG.RU

Реализация Undo, Redo

 


1

2

Всем привет, как грамотно реализовать Undo и Redo в программе, где много различных параметров меняется, я думал отслеживать каждый шаг пользователя и записывать в историю, для каждого пункта истории сделать функции Undo и Redo, но тут получается для каждого определенного действия придется наследовать общий класс какой-то, например для удаления объекта, наследуем класс BaseHistoryElement и переписываем функции Undo, Redo в Undo меняем флаг deleted = false; ну и для Redo собственно наоборот. Но с таким подходом очень много кода выйдет для каждого действия, вот и интересно, может есть какой-то более правильный подход?

★★★

Храните историю состояний системы.

AIv ★★★★★ ()

посмотри на sam редактор = это первый редактор у которого был реализован бесконечный undo

qulinxao ★★☆ ()

банда четырёх описала принцип.

DELIRIUM ☆☆☆☆☆ ()

на правах бреда:
на каждый чих делать ченть типо
undo_redo[next] = mem_diff() // return array a[addr]==changed_value

anTaRes ★★★★ ()

Если состояние будет представлено немутабельной структурой, то undo/redo получится сам собой.

bj ()

Можно сделать массив адресов на объекты и сохранять на каждом шаге память для этих адресов. И при Undo/Redo заменять имеющуюся память на сохраненную в истории... Я думаю не так много должно оперативки сжирать подобное, ну по крайне мере если ограничивать количество записей в истории.

Int64 ★★★ ()
Ответ на: комментарий от Int64

Но кстати std::string с таким не дружит, если для структуры вызвать к примеру memset (&obj, &mem, sizeof(obj)); то если там есть std::string выдает ошибку seg fault :(

Int64 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.