Здраствуйте, Товарищи.
Не подскажете, как сотворить запрет на создание объектов на стеке.
Уже не превый раз возникает такая необходимость.
Вот пример:
в нашей программе все андушные объекты хранятся в анду-манагере (указатели на них), и естественно просто так взять и грохнуть объект нельзя, можно только сказать ему Delete(), и он пометится в анду-манагере как удаленный, чтобы потом можно было анду-манагеру сказать Undo(), и только что замоченный объект — тут как тут. Если бы мы грохнули объект delete'ом, то к нему уже ясен пень проандушится было бы не возможно, и к тому же в стеке анду-транзакций останется куча ссылок на него, и выколупывать их никто не будет; да и вообще, какое тогда анду, если объект чья история у нас хранится взять и физически грохнуть?
Так вот, при чем тут стековые объекты,- мы-то временем их жизни не управляем — дошли до конца блока и он помер, поэтому наши андушные объекты нельзя создавать на стеке. Сам факт создания андушного объекта есть история анду, которая должна храниться, поэтому при создании такие объекты помещаются в анду-манагер. Анду-манагер сам знает, когда у него нет ссылок на какой-то объект и прибивает его оператором delete, и если подсунуть ему указатель на стековый объект, то хорошего случится мало.
Как запретить создавать объекты некого класса на стеке, я-то знаю — закрываем конструкор и делаем функцию static Object * Create();, которая будет создавать объекты в куче. Но вот проблема с анду — в том, что надо (очень хочется

) запреть в базовом классе создавать [b]наследников[b] на стеке. Наследников у нашего IUndoObject штук 100 не меньше, и всем закрывать конструктор и писать Create() не самый удачный выход, потому что это все равно не проверяется компилятором (ему-то гаду пофиг) — достаточно где-то завтыкать, или написать новый код, в котором забыть про Create, и все — упадешь и не заметишь. Да и вообще — это куча дублирования кода, и так сказать "мантра", которую надо помнить, знать и понимать.
Извините если сумбурно объяснил причины, надеюсь на помощь.