В процес съм на преобразуване (поне) на част от моя код към използване на shared_ptr. Въпреки това срещам проблем с модела Observer, който използвам.
Имам клас презентатор (Model View Presenter), който прилага модела Observer и получава известия, когато се случат определени събития. Написах общи класове Subject/Observer, от които всеки клас може да наследи. Методът за актуализиране изглежда по следния начин:
void MyPresenter::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
Това работи добре, докато не преобразувах myService_
(член на клас MyPresenter) в std::shared_ptr
. Сега изразът (subject == myService_)
вече не е валиден.
В крайна сметка може да преобразувам всичко в shared_ptr, но дотогава има ли лесен начин да поддържам както необработени указатели, така и shared_ptr с модела Observer? В идеалния случай бих искал моделът на наблюдателя да бъде агностичен за изпълнението на указателя на наблюдателя, но може би това не е възможно. Как мога да поправя това?
АКТУАЛИЗАЦИЯ
Трябва ли интерфейсът на наблюдателя да вземе споделен указател? Или е по-добре да го запазите като необработени указатели? В момента имам:
class Subject;
class Observer
{
public:
virtual ~Observer() {}
virtual void Update(Subject *subject) = 0;
protected:
Observer() {}
};