Я нахожусь в процессе преобразования (по крайней мере) части моего кода для использования 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? В идеале я хотел бы, чтобы шаблон наблюдателя был независим от реализации указателя наблюдателя, но, возможно, это невозможно. Как я могу это исправить?
UPDATE
Должен ли интерфейс Observer шаблона наблюдателя принимать общий указатель? Или лучше держать это в качестве сырых указателей? В настоящее время у меня есть:
class Subject;
class Observer
{
public:
virtual ~Observer() {}
virtual void Update(Subject *subject) = 0;
protected:
Observer() {}
};