Я нахожусь в процессе преобразования (по крайней мере) части моего кода в использование shared_ptr. Однако у меня возникла проблема с шаблоном Observer, который я использую.
У меня есть класс презентатора (представитель представления модели), который реализует шаблон 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() {}
};