CodeWalk

C++观察者模式与signal-slots实现

作者:孤独的心 · 2026-05-30 12:55

请用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)提供更完善的实现。