более чем в одном случае я чувствовал необходимость определить методы класса, которые вызываются способом, аналогичным конструкторам или деструкторам.
Конкретный пример будет; в программе у меня была очень сложная сеть узлов разных типов, которые взаимно зависели друг от друга очень нерегулярно (сеть вообще не напоминала дерево). Когда узел должен был быть уничтожен, он запускал сложную цепочку разрушений в сети. Очень похоже на паутину, которая разрывается на части, но сложнее.
Во время выполнения этой цепочки управление возвращалось к методам инициатора (или одного из промежуточных элементов в цепочке), так что фактическое уничтожение должно было произойти, когда цепочка установилась, и поэтому Я не мог использовать деструкторы для этой цели. Однако в иерархии классов моих узлов мне был нужен «подобный деструктору», то есть лестничный способ вызова моей неразрушающей функции перед уничтожением (по тем же причинам, почему фактический деструктор также называется таким образом, а именно: каждый шаг в иерархии классов должен был вносить свой вклад в цепочку).
Я закончил кодировать лестницу вручную. А именно, класс nodeBase имеет метод preDestroyNodeBase, который выполняет свою работу и вызывает виртуальный метод preDestroyNode и т. Д. До конца (я знаю, так он выглядит как конструктор, но он был сравнительно более элегантным). таким образом, поскольку вы можете просто вызвать «preDestroy» самого базового класса).
Вы можете себе представить, насколько подвержен ошибкам этот подход, не говоря уже о безобразии. Есть ли более чистый способ эмуляции конструктора или деструктора для вызова методов? Какая-то магия шаблонов или даже макрокоманда! Поскольку ручное кодирование слишком чревато ошибками даже для одного программиста, поэтому я не могу представить, что такое поведение будет передано клиентам библиотеки.
Может быть, я упускаю фундаментальную концепцию программирования, которая устраняет необходимость в таких функциях. Если это так, я был бы рад, если бы вы указали, как еще можно обработать этот пример сети узлов.
Большое спасибо!