#include<string.h>
typedef struct _operate
{
int a;
int b;
int (*getResult)(struct _operate *p);
}Operate;
typedef struct _add
{
Operate add;
int c;
}Add;
typedef struct _sub
{
Operate sub;
int c;
}Sub;
typedef struct _mul
{
Operate mul;
int c;
}Mul;
typedef struct _div
{
Operate div;
int c;
}Div;
int f_add(Operate *p)
{
return (p->a + p->b);
}
int f_sub(Operate *p)
{
return (p->a - p->b);
}
int f_mul(Operate *p)
{
return (p->a * p->b);
}
int f_div(Operate *p)
{
return (p->a / p->b);
}
Operate *simple_factory(int flag)
{
Operate *operate = NULL;
switch(flag)
{
case 1:
operate = (Operate *)malloc(sizeof(Add));
memset(operate,0,sizeof(Add));
operate->getResult = f_add;
break;
case 2:
operate = (Operate *)malloc(sizeof(Sub));
memset(operate,0,sizeof(Sub));
operate->getResult = f_sub;
break;
case 3:
operate = (Operate *)malloc(sizeof(Mul));
memset(operate,0,sizeof(Mul));
operate->getResult = f_mul;
break;
case 4:
operate = (Operate *)malloc(sizeof(Div));
memset(operate,0,sizeof(Div));
operate->getResult = f_div;
break;
}
return operate;
}
#include<stdio.h>
#include<stdlib.h>
#include"simpleFactory.c"
/*
Add *ad = NULL;
Operate *op = (Operate *)malloc(sizeof(Add));
ad = (Add *)op //lower to child
Operate op = NULL;
Add *add = (Add *)malloc(sizeof(Add));
op = (Operate *)add; //upper to father
*/
/* 1-->'+' 2-->'-' 3-->'x' 4-->'/' */
void main(int args, int argc[])
{
int ret = 0;
Add * add = NULL;
Operate *op = simple_factory(1);
op->a = 5;
op->b = 2;
ret = op->getResult(op);
printf("ret is %d\n",ret);
}