Thiết kế Callbacks trong C++: Con trỏ hàm – https://final-blade.com

Thiết kế Callbacks trong C++: Con trỏ hàm

Trong bài viết này, tất cả chúng ta sẽ tranh 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 nhờ vào vào hàm callback mà ta cung ứng, tức là nếu ta giữ nguyên nguồn vào cho API và chỉ cần đổi khác callback thì đầu ra của API sẽ đổi khác. Hãy 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 phân phối. API này sẽ triển khai những bước sau :

  1. Thêm header và footer vào đoạn dư liệu thô để tạo ra thông điệp.
  2. Mã hóa toàn bộ thông điệp.
  3. 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 phụ thuộc vào vào ứng dụng, do đó trong API này phân phối một pháp luật để 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 để kiến thiết 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à, tác dụng 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 tác dụng 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 đã đổi khác .
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 dùng này .

Chia sẻ:

  • More

Like this:

Like

Loading …