Tóm Tắt
Thiết kế Callbacks trong C++: Con trỏ hàm
Trong bài viết này, tất cả chúng ta sẽ bàn luận về callback là gì và những loại callback nào tất cả chúng ta hoàn toàn có thể có trong C + + và cách phong cách thiết kế Callback dưới dạng con trỏ hàm .
Callback là gì?
Callback ( gọi lại ) là một hàm mà tất cả chúng ta chuyển đến những API khác làm đối số trong khi gọi chúng. Giờ đây, những API này sẽ sử dụng callback gọi lại hàm được phân phối của tất cả chúng ta vào một thời gian nào đó .
Có 3 kiểu callback trong c++
- Con trỏ hàm
- Đối tượng hàm
- Hàm lambda
Hành vi hoặc tác dụng của API phụ thuộc vào vào hàm callback mà ta phân phối, tức là nếu ta giữ nguyên nguồn vào cho API và chỉ cần biến hóa callback thì đầu ra của API sẽ biến hóa. Hãy tìm hiểu và khám phá điều này bằng cách ,
Sử dụng con trỏ hàm như là một callback
Từ framework, ta có một API hoàn toàn có thể tạo một thông điệp hoàn hảo từ những tài liệu thô được cung ứng. API này sẽ thực thi những bước sau :
- Thêm header và footer vào đoạn dư liệu thô để tạo ra thông điệp.
- Mã hóa toàn bộ thông điệp.
- Trả lại thông điệp.
Bây giờ API này biết header và footer là gì nhưng lại không biết về logic mã hóa đúng mực, vì điều đó không được thiết lập trong framework, hoàn toàn có thể biến hóa từ ứng dụng này sang ứng dụng khác. Vì logic mã hóa nhờ vào vào ứng dụng, do đó trong API này cung ứng một lao lý để truyền logic mã hóa như một con trỏ hàm gọi lại. API này sẽ gọi lại hàm của ứng dụng bằng cách gọi trải qua con trỏ hàm đã truyền này .
Cơ chế gọi lại (Callback)API của Framework đồng ý callback với con trỏ hàm là một đối số như sau ,
12345678 |
std::stringbuildCompleteMessage(std::stringrawData,std::string(*encrypterFunPtr)(std::string)) { / / Add some header and footer to data to make it complete message rawData=” [ HEADER ] “+rawData+” [ FooTER ] “; / / Call the callBack provided i. e. function pointer to encrypt the message rawData=encrypterFunPtr(rawData); returnrawData; } |
Giờ thì, khi một ứng dụng gọi API này của framework để thiết kế xây dựng thông tin, nó sẽ truyền một con trỏ đến hàm cục bộ của nó như một đối số .
Giả sử, ta có một hàm là một callback như bên dưới. Hàm mã hóa này sẽ tăng tổng thể những ký tự trong thông điệp lên 1 .
123456789 |
std::stringencryptDataByLetterInc(std::stringdata) { for(inti=0;ivàlt;data.size();i+ +) { if((data[i]> =’ a ‘vàamp;vàamp;data[i]vàlt;=’ z ‘)| |(data[i]> =’ A ‘vàamp;vàamp;data[i]vàlt;=’ Z ‘)) data[i]+ +; } returndata; } |
Bây giờ, thử gọi API trên để tạo một thông điệp có hàm mã hóa như ta vừa mới tạo ra ,
12 |
std::string msg =buildCompleteMessage(” SampleString “,vàamp;encryptDataByLetterInc); std::coutvàlt;vàlt;msgvàlt;vàlt;std::endl; |
Kết quả : [ IFBEFS ] TbnqmfTusjoh [ GppUFS ]
Tiếp theo, hãy tạo ra một hàm mã hóa khác. Lúc này, tổng thể cá ký tự trong chuỗi sẽ bị giảm đi một .
123456789 |
std::stringencryptDataByLetterDec(std::stringdata) { for(inti=0;ivàlt;data.size();i+ +) { if((data[i]> =’ a ‘vàamp;vàamp;data[i]vàlt;=’ z ‘)| |(data[i]> =’ A ‘vàamp;vàamp;data[i]vàlt;=’ Z ‘)) data[i]–; } returndata; } |
Và, hiệu quả khi gọi API
12 |
std::stringmsg=buildCompleteMessage(” SampleString “,vàamp;encryptDataByLetterDec); std::coutvàlt;vàlt;msgvàlt;vàlt;std::endl; |
là [ GD @ CDQ ] R ` lokdRsqhmf [ EnnSDQ ]
Ta thấy hiệu quả của lần gọi này khác với trước đó. Mặc dù giữ nguyên API và tài liệu đã chuyển nhưng ta đã đổi khác hàm callback được truyền, dẫn đến hành vi hoặc tác dụng của API đã biến hóa .
Vậy là tất cả chúng ta đã biết được như thế nào gọi là callback và cách sử dụng con trỏ hàm để truyền một callback. Trong phần tiếp theo, ta sẽ tìm hiều đối tương hàm gọi lại cũng như tại sao lại cần đối tượng người tiêu dùng này .
Chia sẻ:
- More
Like this:
Like
Loading …
Bài viết liên quan
Source: https://final-blade.com
Category : Kiến thức Internet