網(wǎng)站設計一年費用有鏈接的網(wǎng)站
文章目錄
- 案例 1:圖形繪制庫中的回調(diào)使用
- 場景說明
- 代碼實現(xiàn)
- 代碼解釋
- 案例 2:網(wǎng)絡服務器中的連接和消息處理回調(diào)
- 場景說明
- 代碼實現(xiàn)
- 代碼解釋
- 案例 3:定時器中的回調(diào)使用
- 場景說明
- 代碼實現(xiàn)
- 代碼解釋
以下將通過不同場景給出幾個使用回調(diào)類型的具體案例,幫助你理解回調(diào)類型在 C++ 中的使用方式。我在這里掉進一個坑,一直以為調(diào)用回調(diào)函數(shù)時,是在調(diào)用回調(diào)fction構(gòu)造回調(diào)類型函數(shù)類型,就一直在下為什么他在這里只傳入了類的指針(雖然類有成員方法,但是它知道調(diào)用哪個嗎?)。后面發(fā)現(xiàn)在main函數(shù)調(diào)用回調(diào)函數(shù)時,才發(fā)現(xiàn)這里傳入的是類外面,重新創(chuàng)建的回調(diào)函數(shù)。(可以不用看😂)
這里的聲明的類型例如:using DrawCompleteCallback = std::function<void()>; ,它僅僅只是一個類型,方便類中方法的參數(shù)定義,后面定義的回調(diào)函數(shù)才是真正作為回調(diào)函數(shù)要調(diào)用,并且可以使用回調(diào)類型的方法。
案例 1:圖形繪制庫中的回調(diào)使用
場景說明
假設你正在開發(fā)一個簡單的圖形繪制庫,當圖形繪制完成后,需要通知調(diào)用者執(zhí)行一些額外操作,比如記錄日志或者更新界面狀態(tài)。這時就可以使用回調(diào)函數(shù)來實現(xiàn)這種通知機制。
代碼實現(xiàn)
#include <iostream>
#include <functional>// 定義繪制完成的回調(diào)類型
using DrawCompleteCallback = std::function<void()>;// 圖形類
class Shape {
public:void draw(DrawCompleteCallback callback) {std::cout << "Drawing the shape..." << std::endl;// 模擬繪制過程for (int i = 0; i < 1000000; ++i) {}std::cout << "Shape drawn." << std::endl;// 繪制完成后調(diào)用回調(diào)函數(shù)if (callback) {callback();}}
};// 日志記錄函數(shù),作為回調(diào)函數(shù)
void logDrawCompletion() {std::cout << "Logging: Shape drawing is completed." << std::endl;
}int main() {Shape shape;// 使用日志記錄函數(shù)作為回調(diào)shape.draw(logDrawCompletion);return 0;
}
代碼解釋
- 回調(diào)類型定義:
DrawCompleteCallback
是一個不接受任何參數(shù)且返回值為void
的可調(diào)用對象類型。 Shape
類:draw
方法接受一個DrawCompleteCallback
類型的參數(shù),在圖形繪制完成后調(diào)用該回調(diào)函數(shù)。- 回調(diào)函數(shù)實現(xiàn):
logDrawCompletion
是一個普通函數(shù),作為回調(diào)函數(shù)用于記錄圖形繪制完成的日志。 - 主函數(shù)調(diào)用:在
main
函數(shù)中,創(chuàng)建Shape
對象并調(diào)用draw
方法,傳入logDrawCompletion
作為回調(diào)函數(shù)。
案例 2:網(wǎng)絡服務器中的連接和消息處理回調(diào)
場景說明
在一個簡單的網(wǎng)絡服務器中,需要處理新連接的建立、連接關閉以及接收到消息等事件??梢允褂没卣{(diào)函數(shù)來處理這些事件。
代碼實現(xiàn)
#include <iostream>
#include <memory>
#include <functional>// 假設的連接類和消息類
class BaseMessage {
public:using ptr = std::shared_ptr<BaseMessage>;
};class BaseConnection {
public:using ptr = std::shared_ptr<BaseConnection>;
};// 定義回調(diào)類型
using ConnectionCallback = std::function<void(const BaseConnection::ptr&)>;
using CloseCallback = std::function<void(const BaseConnection::ptr&)>;
using MessageCallback = std::function<void(const BaseConnection::ptr&, BaseMessage::ptr&)>;// 服務器類
class Server {
public:void setConnectionCallback(const ConnectionCallback& cb) {connectionCallback = cb;}void setCloseCallback(const CloseCallback& cb) {closeCallback = cb;}void setMessageCallback(const MessageCallback& cb) {messageCallback = cb;}// 模擬新連接事件void simulateNewConnection() {BaseConnection::ptr conn = std::make_shared<BaseConnection>();if (connectionCallback) {connectionCallback(conn);}}// 模擬連接關閉事件void simulateConnectionClose() {BaseConnection::ptr conn = std::make_shared<BaseConnection>();if (closeCallback) {closeCallback(conn);}}// 模擬接收到消息事件void simulateMessageReceived() {BaseConnection::ptr conn = std::make_shared<BaseConnection>();BaseMessage::ptr msg = std::make_shared<BaseMessage>();if (messageCallback) {messageCallback(conn, msg);}}private:ConnectionCallback connectionCallback;CloseCallback closeCallback;MessageCallback messageCallback;
};// 處理新連接的回調(diào)函數(shù)
void handleNewConnection(const BaseConnection::ptr& conn) {std::cout << "New connection established." << std::endl;
}// 處理連接關閉的回調(diào)函數(shù)
void handleConnectionClose(const BaseConnection::ptr& conn) {std::cout << "Connection closed." << std::endl;
}// 處理接收到消息的回調(diào)函數(shù)
void handleMessageReceived(const BaseConnection::ptr& conn, BaseMessage::ptr& msg) {std::cout << "Message received on connection." << std::endl;
}int main() {Server server;// 設置回調(diào)函數(shù)server.setConnectionCallback(handleNewConnection);server.setCloseCallback(handleConnectionClose);server.setMessageCallback(handleMessageReceived);// 模擬事件server.simulateNewConnection();server.simulateMessageReceived();server.simulateConnectionClose();return 0;
}
代碼解釋
- 回調(diào)類型定義:定義了
ConnectionCallback
、CloseCallback
和MessageCallback
三種回調(diào)類型,分別用于處理新連接建立、連接關閉和接收到消息事件。 Server
類:提供了設置回調(diào)函數(shù)的方法,并模擬了三種事件的發(fā)生,在事件發(fā)生時調(diào)用相應的回調(diào)函數(shù)。- 回調(diào)函數(shù)實現(xiàn):分別實現(xiàn)了處理新連接、連接關閉和接收到消息的回調(diào)函數(shù)。
- 主函數(shù)調(diào)用:在
main
函數(shù)中,創(chuàng)建Server
對象,設置回調(diào)函數(shù),并模擬三種事件的發(fā)生。
案例 3:定時器中的回調(diào)使用
場景說明
實現(xiàn)一個簡單的定時器類,當定時器超時后,執(zhí)行指定的回調(diào)函數(shù)。
代碼實現(xiàn)
#include <iostream>
#include <functional>
#include <thread>
#include <chrono>// 定義定時器回調(diào)類型
using TimerCallback = std::function<void()>;// 定時器類
class Timer {
public:void start(int seconds, TimerCallback callback) {std::thread([seconds, callback]() {std::this_thread::sleep_for(std::chrono::seconds(seconds));if (callback) {callback();}}).detach();}
};// 定時器超時后的回調(diào)函數(shù)
void onTimerExpired() {std::cout << "Timer expired!" << std::endl;
}int main() {Timer timer;// 啟動定時器,設置超時時間為 3 秒,并傳入回調(diào)函數(shù)timer.start(3, onTimerExpired);std::cout << "Timer started. Waiting for expiration..." << std::endl;// 為了避免主線程提前退出,讓主線程休眠一段時間std::this_thread::sleep_for(std::chrono::seconds(5));return 0;
}
代碼解釋
- 回調(diào)類型定義:
TimerCallback
是一個不接受任何參數(shù)且返回值為void
的可調(diào)用對象類型。 Timer
類:start
方法接受一個超時時間(秒)和一個TimerCallback
類型的回調(diào)函數(shù),啟動一個新線程,在指定的超時時間后調(diào)用回調(diào)函數(shù)。- 回調(diào)函數(shù)實現(xiàn):
onTimerExpired
是一個普通函數(shù),作為定時器超時后的回調(diào)函數(shù),輸出提示信息。 - 主函數(shù)調(diào)用:在
main
函數(shù)中,創(chuàng)建Timer
對象,啟動定時器并傳入onTimerExpired
作為回調(diào)函數(shù)。
通過以上案例,你可以看到回調(diào)類型在不同場景下的使用方式,其核心思想是將一個可調(diào)用對象作為參數(shù)傳遞給某個函數(shù)或類,在特定事件發(fā)生時調(diào)用該可調(diào)用對象。