274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|||||||||||
1 | |||||||||||
Откатываемый (undoable) класс16.03.2010, 22:07. Показов 800. Ответов 6
Метки нет (Все метки)
Решил тут сделать универсальный интерфейс "откатываемости", который можно было бы прикрутить к любому классу. Идея в том, чтобы, унаследовав свой класс от некоторого класса Undoable, получить возможность сохранять, отменять и повторять изменения, произошедшие с классом. Ну, как undo/redo в любой программе.
Но смысл именно в универсальности, т.е. отменять действия не на уровне приложения, а на уровне каждого отдельного класса, которому такая функциональность необходима. Первый вариант я сделал. Но результат пока что не тот, который хотелось бы видеть. Функциональность я реализовал, но для её получения мне необходимо наследование "наоборот", т.е. унаследовать не мой класс от класса Undoable, а Undoable от моего класса. Это решение по-своему хорошо, но мне всё-таки хотелось поместить Undoable на вершину иерархии. Не подкинете идейку? Исходный код прилагается. Undoable.h
Пример использования
3 6 7 5 3 5 6 2 9 1 3 6 7 3 6 7 5 3 5 6 2 9 1 3 6 7
1
|
16.03.2010, 22:07 | |
Ответы с готовыми решениями:
6
Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами Класс: Разработать абстрактный класс класс Point для задания координаты... Отдельно класс данных, класс формул и главный класс |
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
17.03.2010, 20:17 | 2 | |||||
Идейка называется CRTP (Curiously Recurring Template Pattern). Вкратце выглядит так:
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
18.03.2010, 13:22 [ТС] | 3 | |||||
Nick Alte, что-то пока не получается реализовать. Ты не мог бы схематично расписать одну из функций класса Undoable?
В моём способе Undoable наследуется от класса T, поэтому он может работать с переменными этого класса. А как работать с классом, когда ты не знаешь, что в нём лежит? Добавлено через 31 минуту А, я понял, там нужно приведение типов делать. Но всё равно суть остаётся та же: откатываемый класс находится на дне иерархии. А вот можно ли как-нибудь его наверх вытащить? Добавлено через 15 часов 21 минуту Так-с, с паттерном, вроде, разобрался. Спасибо за наводку. Но по-прежнему не могу создать копию объекта внутри класса Undoable. Вот такая конструкция в классе Undoable
/Developer/SDKs/MacOSX10.5.sdk/usr/include/c++/4.0.0/debug/safe_iterator.h:127: error: attempt to copy-construct an iterator from a singular iterator. Objects involved in the operation: iterator "this" @ 0x0x1001cc { type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPP7myClassN10__gnu _norm6vectorIS4_SaIS4_EEEEEN15__gnu_debug_def6vectorIS4_S8_EEEE (mutable iterator); state = singular; } iterator "other" @ 0x0xbffff724 { type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPP7myClassN10__gnu _norm6vectorIS4_SaIS4_EEEEEN15__gnu_debug_def6vectorIS4_S8_EEEE (mutable iterator); state = singular; } Как решить проблему?
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
18.03.2010, 20:52 | 4 |
Тут идёт какая-то заморочка с итераторами. Для обычных типов конструкция правильная, должно работать.
0
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
18.03.2010, 21:04 | 5 |
volovzi, то что ты пытаешься сделать невыгодно.
Предположим у меня есть объект имеющий 1000 членов данных. Я перед выполнением некой операции, изменяющей 1 член данных, сохраняю состояние всех членов с помощью вызова твоей операции save (вызывая возможно очень дорогостоящий конструктор копирования). Вопрос на кой хрен мне хранить лишние состояние 999 членов, если я изменения касаются только одного? volovzi, все уже придумано до тебя, см. в сторону паттерна COMMAND (Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектно-ориентированного проектирования. Паттерны проектирования).
1
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
18.03.2010, 21:10 | 6 |
Начал эту книгу читать, книга ok...
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
19.03.2010, 01:56 [ТС] | 7 |
0
|
19.03.2010, 01:56 | |
19.03.2010, 01:56 | |
Помогаю со студенческими работами здесь
7
Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо Класс, производный класс, паблик-класс Разработать базовый класс "прямоугольник", производный класс "Окно" и класс-контейнер "Список окон" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |