Здравствуйте, Erop, Вы писали:
E>Здравствуйте, pastey, Вы писали:
P>>Извините если сумбурно объяснил причины, надеюсь на помощь.
E>Если я верно понял, что тебе надо, то могу предложить такую схему.
E>1) В корневой класс ваших undo-объектов, добавляешь шаблон метода, который создаёт наследника.
E>2) В реальности эта штука должна создавать не заявленного наследника, а шаблонного наследника от него.
E>3) В корневом классе заводишь pure virtual метод, который сторонний код не может перекрыть (например там можно заюзать private типы).
E>То есть как-то так, примерно: E>class CUndoObject {
E> struct SecretSeed {};
E> template<typename T> class Placeholder : public T { void checkSecretSeed( const SecretSeed& ) {} };
E>public:
E> template<typename T>
E> static T* CreateNew() { return new Placeholder<T>;
E>private:
E> virtual void checkSecretSeed( const SecretSeed& ) = 0;
E>};
E>Вторая стратегия -- проверка в rt.
E>1) перекрываем у CUndoObject operator new
E>2) внутри него регим все аллокируемые блоки
E>3) в конструкторе кастимся по dynamic_cast к void* и смотрим есть ли такой блок в базе.
E>Если есть -- то вычёркиваем. Если нет -- ругаемся...
Супер — спасибо большое — выглядит очень классно, особенно первое.
Второе тоже ничего, но на ран-тайм откладывать не хочется — пропустим какой-то редко используемы случай и кирдык.
Завтра испытаю — отпишусь, сейчас под рукой нет компилятора.
Еще раз спасибо большое.
И так — ради прикола — на днях посетила мысля, как на плюсах файнал класс сделать — приватим конструктор, открываем CreateNew() и готово — попробуй отнаследуйся; может и баян, но я сам придумал