Рассмотрим следующий случай:
typedef boost::shared_ptr<B> BPtr;
class A
{
public:
A() { b_ptr = BPtr(new B); }
void a_func() { C::c_func(b_ptr); }
private:
BPtr b_ptr;
}
class B
{
public:
B() { b_ptr = BPtr(this); }
void b_func() { C::c_func(b_ptr); }
private:
BPtr b_ptr;
}
class C
{
public:
static void c_func(BPtr b_ptr) { /*...*/ }
}
Можно ли создавать экземпляр shared_ptr с помощью this
?
Можно ли иметь два объекта shared_ptr, указывающие на один и тот же объект?(например, A :: b_ptr и B :: b_ptr)
Если один из этих двух выйдет из области видимости - будет ли удален экземпляр B?
Я предполагаю, что делаю что-то в корне неправильное.
Я также думал об использовании внедрения зависимостей b_ptr в конструктор B. Но это тоже кажется очень неправильным.
ОБНОВЛЕНИЕ:
Чтобы уточнить - и A, и B должны использовать C:: c_func.В свою очередь, после некоторой обработки C необходимо вызвать функцию обратного вызова в B, которую я не указал выше.На самом деле интересны два случая:
- Если есть требование, чтобы C не сохранял состояние - тогда ему нужно получать BPtr как от A, так и от B, как в коде выше.
- Если C является состоянием, и A и B создают отдельные экземпляры C, давая BPtr в ctor.