โจทย์ปัญหา
สร้างฟังก์ชันที่คืนค่า Pointer to Array of Integer Function Pointers ใช้สำหรับเปรียบเทียบค่าสองค่าและคืนที่อยู่หน่วยความจำของค่าที่มากกว่า
แนวคิด Function Pointers
Function Pointer คือตัวแปรที่เก็บที่อยู่ของฟังก์ชัน ช่วยให้สามารถส่งฟังก์ชันเป็นพารามิเตอร์ หรือเลือกฟังก์ชันที่จะรันได้ใน Runtime ทำให้โค้ดยืดหยุ่นขึ้น
ฟังก์ชัน big() - เปรียบเทียบและคืนที่อยู่ค่าที่มากกว่า
int* big(int &x, int &y) {
if (x > y)
return &x;
else
return &y;
}
การประกาศฟังก์ชันที่คืน Pointer to Array of Function Pointers
รูปแบบทั่วไป: return_type (*function_name(parameters))[array_size]
ตัวอย่าง: ฟังก์ชันคืน Pointer ไปยัง Array ของ 2 Function Pointers ที่รับ (int, int) และคืน int*
// Typedef ช่วยให้อ่านง่ายขึ้น
typedef int* (*FuncPtr)(int&, int&);
// ฟังก์ชันคืน Pointer to Array[2] of FuncPtr
FuncPtr (*getFuncArray())[2] {
static FuncPtr arr[2] = {big, another_func};
return &arr;
}
โค้ดตัวอย่างสมบูรณ์
#include <iostream>
using namespace std;
int* big(int& x, int& y) {
if (x > y) return &x;
else return &y;
}
int* small(int& x, int& y) {
if (x < y) return &x;
else return &y;
}
// Typedef สำหรับ Function Pointer
typedef int* (*CompareFunc)(int&, int&);
// ฟังก์ชันคืน Pointer to Array[2] of CompareFunc
CompareFunc (*getCompareFuncs())[2] {
static CompareFunc funcs[2] = {big, small};
return &funcs;
}
int main() {
int a = 4, b = 7;
int* c = big(a, b);
cout << "The bigger value is " << *c << "\n";
// ใช้ Function Pointer Array
CompareFunc (*funcArray)[2] = getCompareFuncs();
cout << "Big: " << *(*funcArray)[0](a, b) << endl;
cout << "Small: " << *(*funcArray)[1](a, b) << endl;
return 0;
}
ผลลัพธ์
The bigger value is 7
Big: 7
Small: 4
คำอธิบายเพิ่มเติม
- ใช้
typedefหรือusingทำให้ Syntax อ่านง่ายขึ้นมาก staticarray ภายในฟังก์ชัน ทำให้คืน Pointer ได้ปลอดภัย (ไม่ใช่ local variable ที่ถูกทำลาย)- Pattern นี้ใช้ใน Strategy Pattern, Plugin Systems, Callback Tables
- C++11+ สามารถใช้
std::functionและstd::arrayแทนได้สะดวกกว่า
Syntax Cheat Sheet
| Declaration | ความหมาย |
|---|---|
int (*fp)(int) | Function Pointer รับ int คืน int |
int (*fp[3])(int) | Array[3] ของ Function Pointers |
int (*(*fp)[3])(int) | Pointer to Array[3] of Function Pointers |
int (*(*func())[3])(int) | Function คืน Pointer to Array[3] of Function Pointers |