C语言中使用struct模拟class时this指针的实现方式
本文连接:https://www.cnblogs.com/jqdy/p/14351991.html
有很多例子介绍C编程时使用结构(struct)模拟类(class)的方法。这些例子有个共同的特点,都没有涉及到class中this指针的处理方法,造成类的“方法”处理“属性”必须把需要的多个“属性”以参数形式传递给“方法”,从而造成效率和空间的额外支出。
例如,下面这个例子中在使用方法add()时,必须把两个属性a、b直接以参数形式进行传递(第18行):
1 typedef struct{ 2 int a; 3 int b; 4 int(*add)(int, int); 5 }AccTypedef; 6 7 int Add(int a, int b) 8 { 9 return a + b; 10 } 11 12 void main() 13 { 14 int result; 15 //类初始化 16 AccTypedef myAcc = {1, 2, Add};
17 //使用add方法时
18 result = myAcc.add(myAcc.a, myAcc.b);
19 //......
20 }
那么,能不能借助this指针的概念简化这个过程呢?
在Keil中如下处理即可:
1 typedef struct thisAcc{ 2 int a; 3 int b; 4 int (*add)(struct thisAcc*); 5 }AccTypedef; 6 7 int Add(AccTypedef* _this) 8 { 9 return _this->a + _this->b; 10 } 11
12 void main()
13 {
14 int result;
15 //类初始化
16 AccTypedef myAcc = {1, 2, Add};
17 //使用add方法时
18 result = myAcc.add(&myAcc);
19 //......
20 }
定义结构类型 AccTypedef 时采用 “typedef struct 结构名 { 结构体 } 类型名”的方式,其中“结构名”是不能省略的。
以第二个程序片段为例说明:
第1行中的“结构名” thisAcc 不能省略,它要提供给第4行定义 int (* add)(struct thisAcc*)时使用,指示编译器 thisAcc 究竟为何方神圣,因为此时编译器还没有读到第5行的 AccTypedef,不能使用 int (* add)(AccTypedef*)的方式。另外第四行中的 struct 也不能省略,否则编译器不清楚 thisAcc 是一个结构了。
这样处理后,在使用“方法”add时,仅将myAcc的地址传入即可,见第18行。这个传入的地址 &myAcc,即为 this 指针。
通过这种处理方法,就达到了this指针的效果。