C++观察者模式与signal-slots实现
请用C++实现一个观察者模式(发布-订阅),支持主题订阅和事件通知。
回答
孤独的心
class Observer {
public:
virtual void update(const std::string& msg) = 0;
virtual ~Observer() = default;
};
class Subject {
std::vector<std::weak_ptr<Observer>> observers;
std::mutex mtx;
public:
void attach(std::shared_ptr<Observer> o) {
std::lock_guard lock(mtx);
observers.push_back(o);
}
void notify(const std::string& msg) {
std::lock_guard lock(mtx);
for (auto it = observers.begin(); it != observers.end();) {
if (auto sp = it->lock()) {
sp->update(msg);
++it;
} else {
it = observers.erase(it); // 清理失效观察者
}
}
}
};
使用weak_ptr避免循环引用。C++信号槽库(Boost.Signals2、Qt)提供更完善的实现。