Мне нужно зарегистрировать объект в контейнере при его создании. Без умных указателей Я бы использовать что-то вроде этого:shared_from_this вызывается из конструктора
a_class::a_class()
{
register_somewhere(this);
}
с помощью смарт-указатели, я должен использовать shared_from_this
, но я не могу использовать, что в конструкторе.
Есть clean Способ решения этой проблемы? Что бы вы сделали в подобной ситуации? Я думаю о введении в init
метод для вызова только после создания и поставить все в функции фабрики, как это:
boost::shared_ptr<a_class> create_a()
{
boost::shared_ptr<a_class> ptr(new a_class);
ptr->init();
return ptr;
}
ли это нормально или есть стандартная процедура, чтобы следовать в таких случаях?
EDIT: На самом деле мое дело сложнее. У меня есть 2 объекта, которые должны поддерживать указатели друг на друга. Поэтому я не «регистрирую», а создаю еще один объект (скажем, b_class
), который в качестве параметра должен содержать this
. b_class
получает this
как слабый указатель и сохраняет его.
Я добавляю это, потому что, так как вы даете мне дизайн советы (которые очень ценятся) по крайней мере, вы можете знать, что я делаю:
a_class::a_class()
{
b = new b_class(this);
}
В моей программе a_class
является юридическим лицом и b_class
является одним из конкретных классов, представляющих состояние (в конструкторе это только начальное состояние). a_class
нуждается в указателе на текущее состояние и b_class
нуждается в управлении объектом.
a_class
отвечает за создание и уничтожение b_class экземпляров и, таким образом, поддерживает shared_ptr к ним, но b_class
нужно манипулировать a_class
и, таким образом, поддерживает слабый указатель. a_class
экземпляр «выживает» b_class
экземпляров.
Вы предлагаете избегать использования интеллектуальных указателей в этом случае?
Я не могу насмотреться вашего код, но очевидный вопрос в том, почему 'register_somewhere' нуждается в умном указателе? Обычно он чище, если объект не управляет своей собственной жизнью (это то, что предполагает или требует, чтобы его удерживал умный указатель - это тонкий конец клина). Независимо от того, что создает объект, следует определить стратегию распределения, статическую, автоматическую, динамическую, управляемую интеллектуальным указателем и т. Д. Если вы можете отделить регистрацию и право собственности, то тем лучше. –
Простое решение: sourceforge.net/projects/shared-from-this-ctor/ –