簡單的c++實現訊息釋出/訂閱機制例子(成員函式被其他類掉呼叫的例子)

南水之源發表於2024-10-09

以下是一個簡單的使用 C++ 實現釋出 / 訂閱機制的示例程式碼。這個示例包含一個簡單的事件系統,其中有釋出者(Publisher)和訂閱者(Subscriber)。

以下程式碼需要C++11以上支援

#include <iostream>
#include <vector>
#include <functional>

// 事件引數結構體,可以根據實際需求修改
struct EventData {
    int value;
};

// 事件處理函式型別定義
using EventHandler = std::function<void(const EventData&)>;

// 釋出者類
class Publisher {
public:
    void publish(const EventData& data) {
        for (const auto& handler : subscribers) {
            handler(data);
        }
    }

    void subscribe(EventHandler handler) {
        subscribers.push_back(handler);
    }

private:
    std::vector<EventHandler> subscribers;
};

// 訂閱者類示例
class Subscriber {
public:
    Subscriber(const std::string& name) : name(name) {}

    void onEvent(const EventData& data) {
        std::cout << name << " received event with value: " << data.value << std::endl;
    }

private:
    std::string name;
};

int main()
{
    Publisher publisher;

    Subscriber sub1("Subscriber 1");
    Subscriber sub2("Subscriber 2");

    // 訂閱者註冊事件處理函式,這裡將sub1的onEvent成員函式,傳入到publisher的容器中,被後續publish觸發呼叫。
    publisher.subscribe(std::bind(&Subscriber::onEvent, sub1, std::placeholders::_1));
    publisher.subscribe(std::bind(&Subscriber::onEvent, sub2, std::placeholders::_1));

    EventData event = { 42 };
    publisher.publish(event);

    EventData event2 = { 43 };
    publisher.publish(event2);

    return 0;
}
在這個示例中:
  1. Publisher
    • 有一個publish方法,用於遍歷所有訂閱者的事件處理函式,並呼叫它們,將事件資料傳遞給每個訂閱者。
    • 有一個subscribe方法,用於將訂閱者的事件處理函式新增到subscribers向量中。
  2. Subscriber
    • 每個訂閱者有一個onEvent方法,這個方法定義了訂閱者如何處理接收到的事件。在main函式中,透過std::bindSubscriberonEvent方法繫結到Publishersubscribe方法上,從而註冊為事件處理函式。
  3. main函式中:
    • 建立了一個Publisher物件和兩個Subscriber物件。
    • 兩個Subscriber物件分別訂閱了Publisher釋出的事件。
    • 然後建立一個EventData物件,並透過Publisherpublish方法釋出這個事件,此時所有訂閱者都會接收到這個事件並進行相應的處理。

注意,這是一個非常基礎的釋出 / 訂閱機制示例,在實際應用中,可能需要更多的功能,如事件型別的區分、動態訂閱 / 取消訂閱、多執行緒安全性等。

相關文章