Я работаю с кодовой базой, которая была частично реализована кем-то, кто любил чрезмерно сложные решения простых проблем (например, классы шаблонов с двумя параметрами, которые когда-либо создавались только для одной пары типов). Одна вещь, которую она сделала, заключалась в том, чтобы создать объекты в умном указателе, а затем заставить объект хранить слабый указатель на себя.
class MyClass {
//...
boost::weak_ptr<MyClass> m_self;
//...
};
boost::shared_ptr<MyClass>
Factory::Factory::Factory::CreateMyClass() {
boost::shared_ptr<MyClass> obj(new MyClass(...));
boost::weak_ptr<MyClass> p(obj);
obj->storeSelfPointer(p);
return obj;
}
Затем класс продолжает использовать m_self, блокируя его и передавая полученный общий указатель.
Хоть убей, я не могу понять, чего она пыталась добиться. Есть ли какая-то закономерность или идея, объясняющая эту реализацию? Мне кажется, что это совершенно бессмысленно, и я хотел бы реорганизовать его.
РЕДАКТИРОВАТЬ: я должен упомянуть, что ни одно из мест, использующих результирующий интеллектуальный указатель, полученный в результате блокировки m_self, фактически не сохраняет интеллектуальный указатель.
std::shared_from_this
наверное - person Ben Voigt   schedule 26.06.2014enable_shared_from_this
для C++98. - person Ben Voigt   schedule 26.06.2014Factory::Factory::Factory::
? это интересно - person Cheers and hth. - Alf   schedule 26.06.2014