zoukankan      html  css  js  c++  java
  • 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指针的效果。

  • 相关阅读:
    Linux下oracle数据库操作
    springcloud学习一
    nginx反向代理实现前后端分离
    GIT版本控制(码云)
    VUE环境搭建
    线程池的使用
    neo4j图形数据库实战
    idea 下tomcat字符集问题
    webservice客户端生成方式
    Spring声明式事务不回滚的问题
  • 原文地址:https://www.cnblogs.com/jqdy/p/14351991.html
Copyright © 2011-2022 走看看