Я пытаюсь создать систему наблюдателей в C ++, как систему событий в C#. класс наблюдателя:
template <class T>
class Observer {
int id;
public:
static int nextId;
Observer() : id(nextId++) {}
virtual void handleEvent(const T&) = 0;
virtual ~Observer();
};
класс субъекта:
template<class T>
class Subject {
set<shared_ptr<Observer<T>>> observers;
public:
Subject() : observers() {}
void notify(const T&);
void addObserver(Observer<T>& );
void removeObserver(Observer<T>&);
Subject<T>& operator+=(Observer<T>&);
Subject<T>& operator-=(Observer<T>&);
Subject<T>& operator()(const T&);
};
проблема в том, когда я пытаюсь реализовать addObserver
Я не знаю, как добавить ссылку на набор .
Я понимаю, make_shared<Observer<T>>
создает новый экземпляр, поэтому при попытке make_shared<Observer<T>>(observer)
я получил ошибку при попытке создать абстрактный класс:
ошибка: недопустимый новый -выражение абстрактного типа класса 'Observer'
Я пытался shared_ptr<Observer<T>> observerPtr(observer)
, и это не сработало также:
ошибка: нет подходящей функции для вызова 'std :: shared_ptr> :: shared_ptr (Observer &) '
как я могу создать shared_ptr
из ссылки на объект, полученный из абстрактного класса?
чем я являюсь попытаться добиться - заставить этот пример работать:
class TemperatureSensor : public Subject<int> {};
class AirConditioner : public Observer<int> {
static int nextId;
int id;
void onTemperatureChange(int temperature){
std::cout << "Air Conditioner #" << id << " got a report from TemperatureSensor, reading " << temperature << std::endl;
}
public:
AirConditioner() : Observer() {
id = (++nextId);
}
void handleEvent(const int& param) override {
onTemperatureChange(param);
}
};
int AirConditioner::nextId = 0;
int main(){
TemperatureSensor s;
AirConditioner a,b,c;
(((s += a) += b) += c);
s(42); // Should print:
// Air Conditioner #1 got a report from TemperatureSensor, reading 42
// Air Conditioner #2 got a report from TemperatureSensor, reading 42
// Air Conditioner #3 got a report from TemperatureSensor, reading 42
}