Re[2]: Две возможные стратегии...
От: pastey  
Дата: 05.07.09 12:17
Оценка:
Здравствуйте, 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() и готово — попробуй отнаследуйся; может и баян, но я сам придумал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.