이번 시간에는 구조체 내에 함수 포인터를 멤버 변수(?)로 가진후 구조체 내에서 호출해보자.
#include <stdio.h>
#include <conio.h>
#include "four_arith_op.h"
typedef struct _calculator_t {
int (*op)(int a, int b);
} calculator_t;
typedef int (*fp_calc)(int, int);
int main() {
calculator_t calculator;
calculator.op = &add;
int a = 7;
int b = 3;
float r = 0;
r = calculator.op(a, b);
printf("%d%c%d=%3.1f\\r\\n", a, '+', b, (float)r);
return 0;
}
여기서 주의깊게 볼 부분은, 아래 코드인데, 마치 OOP의 클래스 멤버 함수를 호출하는 것과 같이 사용할수가 있다.
r = calculator.op(a, b);
위 내용을 잘 이해했다면, 분명 다음과 같이 하고 싶을것이다.
calculator.add(a, b);
calculator.sub(a, b);
calculator.mul(a, b);
요롷게 하면 된다.
#include <stdio.h>
#include <conio.h>
int add(int x, int y) {
return (x + y);
}
int sub(int x, int y) {
return (x - y);
}
typedef struct _calculator_t {
int x;
int y;
int (*p_add)(int a, int b); // 함수 포인터가 올수 있다.
int (*p_sub)(int a, int b);
} calculator_t;
typedef int (*fp_calc)(int, int);
int main() {
calculator_t calc;
//calc.x = 11;
//calc.y = 22;
//printf("%d,%d", calc.x, calc.y);
int a = 7;
int b = 3;
float r = 0;
calc.p_add = &add;
r = calc.p_add(a, b);
printf("%d%c%d=%3.1f\\r\\n", a, '+', b, (float)r);
calc.p_sub = ⊂
r = calc.p_sub(a, b);
printf("%d%c%d=%3.1f\\r\\n", a, '+', b, (float)r);
return 0;
}