Pointer To Function
Cách khai báo con trỏ hàm: Giống prototype của hàm cần trỏ tới và thêm dấu * vào đầu tên hàm và thêm dấu ngoặc bao quanh với danh sách tham số giống hàm cần trỏ tới.
Ví dụ:
Cách khai báo con trỏ hàm: Giống prototype của hàm cần trỏ tới và thêm dấu * vào đầu tên hàm và thêm dấu ngoặc bao quanh với danh sách tham số giống hàm cần trỏ tới.
Ví dụ có hàm int Sub(int a, int b); --> int (*PFunc)(int , int);//khai bao con tro ham
Ví dụ:
#include <iostream>
using namespace
std;
int Add(int a, int b);
int Sub(int a, int b);
int (*PFunc)(int , int);//khai bao con tro ham
int CallFuction(int a, int b, int (*pFunc)(int, int));//truyen tham so bang
con tro ham
void main()
{
int a = 10, b = 20;
PFunc = Add;
cout << PFunc(a, b) << endl;
PFunc = Sub;
cout << PFunc(a, b) << endl;
cout << CallFuction(a, b, Add) << endl;
cout << CallFuction(a, b, Sub) << endl;
system("pause");
}
int Add(int a, int b)
{
return (a + b);
}
int Sub(int a, int b)
{
return (a - b);
}
int CallFuction(int a, int b, int (*pFunc)(int, int))
{
return (*pFunc)(a, b);
}
Ví dụ: con trỏ hàm trong sắp xếp mảng
Ví dụ: con trỏ hàm trong sắp xếp mảng
/*
Nhap n so phan
tu cua mang kieu int.
Viet ham random
gia tri < n cho mang tren.
Viet 2 ham sap
xep mang tang dan và giam dan.
Viet ham với
tham so truyen vao la kiểu con trỏ hàm để gọi
1 trong 2 hàm sắp
xếp trên.
*/
#include <iostream>
using namespace
std;
int *NhapMang(int n); //prototype
void InMang(int *parr, int n); //prototype
void SapXepTangDan(int *a, int n); //prototype
void SapXepGiamDan(int *a, int n); //prototype
void HoanDoi(int &x, int
&y);
void CallFunction(int *arr, int n, void(*Func)(int *, int));
void main()
{
int n;//Nhap
so phan tu mang
cout << "Nhap n = ";
cin >> n;
int *A;
A = NhapMang(n);
InMang(A, n);
CallFunction(A, n, SapXepTangDan);//SapXepTangDan(A,
n);
cout << "Sau khi sap xep
tang dan:" << endl;
InMang(A, n);
CallFunction(A, n, SapXepGiamDan);//SapXepGiamDan(A,
n);
cout << "Sau khi sap xep
giam dan:" << endl;
InMang(A, n);
system("pause");
}
int *NhapMang(int n)
{
int *pArr = 0;
pArr = new int[n];
for (int
i = 0; i < n; i++)
{
pArr[i] = rand() % n;
}
return pArr;
}
void InMang(int *parr, int n)
{
for(int
i = 0; i < n; i++)
{
cout << parr[i] << ",
";
}
cout << endl;
}
void SapXepTangDan(int *a, int n)
{
for(int
i = 0; i < n - 1; i++)
{
for(int j = i + 1; j < n; j++)
{
if(a[i] > a[j])
{
HoanDoi(a[i], a[j]);
}
}
}
}
void SapXepGiamDan(int *a, int n)
{
for(int
i = 0; i < n - 1; i++)
{
for(int j = i + 1; j < n; j++)
{
if(a[i] < a[j])
{
HoanDoi(a[i], a[j]);
}
}
}
}
void HoanDoi(int &x, int
&y)
{
x = x ^ y;
y = x ^ y;
x = x ^ y;
}
void CallFunction(int *arr, int n, void(*Func)(int *, int))
{
(*Func)(arr, n);
}