У меня есть объекты, которые создают другие дочерние объекты в своих конструкторах, передавая 'this', чтобы ребенок мог сохранить указатель обратно на родителя. Я широко использую boost:: shared_ptr в своем программировании как более безопасную альтернативу std:: auto_ptr или raw указателям. Таким образом, у ребенка будет такой код, как shared_ptr<Parent>
, а boost предоставляет метод shared_from_this()
, который родитель может передать ребенку.
Моя проблема заключается в том, что shared_from_this()
не может использоваться в конструкторе, что на самом деле не является преступлением, потому что 'this' не должно использоваться в конструкторе, если вы не знаете, что делаете, и не возражаете против ограничения.
Руководство по стилю Google С++ указывает, что конструкторы должны просто устанавливать переменные-члены в свои начальные значения. Любая сложная инициализация должна идти в явном методе Init(). Это решает проблему "этот-в-конструкторе" , а также несколько других.
Меня беспокоит то, что люди, использующие ваш код, должны помнить, что каждый раз, когда они создают один из ваших объектов, вы должны вызывать Init(). Единственный способ, который я могу придумать для этого, - утверждать, что Init() уже был вызван в верхней части каждой функции-члена, но это утомительно, чтобы писать и громоздко выполнять.
Есть ли там какие-либо идиомы, которые решают эту проблему на любом этапе?