Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
La Kiến Vinh Giới thiệu, cách sử dụng và ứng dụng Function Objects hay còn được gọi là Functor trong C++. Function Objects cũng khá lạ với điều này, function objects được hiện thực để sử dụng như một hàm, và có thể dùng như một kiểu dữ liệu (vì bản chất là object trong lập trình hướng đối tượng).

Giới thiệu

Có rất nhiều phương pháp "lạ" do ngôn ngữ C/C++ hỗ trợ, và Function Objects cũng khá lạ với điều này, function objects được hiện thực để sử dụng như một hàm, và có thể dùng như một kiểu dữ liệu (vì bản chất là object trong lập trình hướng đối tượng).

Tiền đề bài viết

Bài viết này là kiến thức và rất dễ làm theo, bài này chỉ một mục đích là tạo cho học trò của tôi và bạn đọc cảm hứng tìm hiểu thêm những điều mới và lạ, việc ứng dụng nó ra sao nằm trong tay bạn.

Đối tượng hướng đến

Phải thông thạo lập trình hướng đối tượng với ngôn ngữ C++. Ngoài ra cần biết thêm kiến thức về con trỏ hàm để dễ tiếp cận bài viết này Con Trỏ Hàm Trong C/C++.

Function Objects là gì?

Function Objects hay còn được biết là Functor, mục tiêu của chúng ta là có thể dùng tên class xem như lời gọi hàm. Tức là với Function Objects ta sẽ có 2 điều sau: dùng như 1 kiểu dữ liệu, hoặc có thể xem như tên hàm để gọi. Xem xét đoạn codes bên dưới để hiểu rõ hơn.

SAddition add_obj;
	
// Use as data type
add_obj.set(10);

// Use as function - 10+15
int result = add_obj(10, 15);

Như codes trên ta thấy, đối tượng add_obj có thể sử dụng như một đối tượng, hoặc có thể gọi hàm, vậy phần việc còn lại của chúng ta là, khi ta gọi như gọi hàm, thì chúng ta phải hiện thực hàm này ra sao?

operator()

Để có thể gọi được add_obj() ta đơn giản hiện thực lại operator() trong class SAddition.

class SAddition
{
public:
	int operator()(int a, int b)
	{
		return a + b;
	}
};

int main()
{
	SAddition add_obj;

	// Original way
	add_obj.operator()(10, 15);

	// Short way
	add_obj(10, 15);

	return 0;
}

Ta hiện thực lại operator() với 2 tham số vào là a và b. Khi tiến hành gọi hàm, ta có thể gọi theo cách truyền thống là đối tượng - chấm - phương thức (add_obj.operator()(10, 15). Hoặc, đạt tới điều cuối cùng mà ta đang thảo luận, gọi như một hàm add_obj(10, 15) là 2 cách gọi tương đương nhau.

Lợi ích

Lợi ích của việc sử dụng Functor thay vì các hàm khác đó là ta có thể hiện thực các hàm và các hàm này có thể lưu trạng thái (trong các thuộc tính của lớp), ta có thể truyền đối tượng vào một hàm khác bao gồm cả các thuộc tính cần thiết thông qua đối tượng và đặc tính này con trỏ hàm không có.

Lời kết

Bài viết này nêu ra lý thuyết của Functor và không đưa ra nhiều tính ứng dụng, việc ứng dụng tôi dành cho các bạn tự sáng tạo.

THẢO LUẬN
ĐÓNG