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指针的效果。

 

posted @ 2021-01-31 11:53  jqdy  阅读(2005)  评论(0编辑  收藏  举报