Мне нужно зарегистрировать объект в контейнере при его создании. Без интеллектуальных указателей я бы использовал что-то вроде этого:
a_class::a_class()
{
register_somewhere(this);
}
С помощью интеллектуальных указателей я должен использовать shared_from_this
, но я не могу использовать это в конструкторе.
Есть ли чистый способ решить эту проблему? Что бы вы сделали в подобной ситуации?
Я собираюсь ввести метод init
для вызова сразу после создания и поместить все в функцию factory следующим образом:
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
экземпляры.
Вы предлагаете избегать использования интеллектуальных указателей в этом случае?