Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การประกาศฟังก์ชัน C/C++ ที่คืนค่า Pointer ไปยัง Array ของ Function Pointers

โจทย์ปัญหา

สร้างฟังก์ชันที่คืนค่า 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 อ่านง่ายขึ้นมาก
  • static array ภายในฟังก์ชัน ทำให้คืน 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