zoukankan      html  css  js  c++  java
  • Android源码中中一种常见的struct使用方法

    直接看例子:

    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    
    struct Base{
        int ba;
        int bb;
        void printB(){
            cout<<"base print"<<endl;
        }
    };
    
    struct A{
        struct Base b;
        int aa;
        void printA(){
            cout<<"A print"<<endl;
        }
    };
    
    int main(){
        //A类型的指针
        struct A *a;
        
        //按A类型创建对象
        a = (struct A *)calloc(1, sizeof(*a));
        a->b.ba = 12;
        a->b.bb = 34;
        a->aa = 65;
        
        //将其传换为Base类型变量
        struct Base  *bp = &(a->b);
        bp->printB();
        cout<<bp->ba<<"  "<<bp->bb<<endl;
        
        //上面的都很常见,但注意这里:将其直接转换回A类型
        struct A *ap = (struct A *)bp;
        ap->printA();
        cout<<ap->b.ba<<"  "<<ap->b.bb<<"  "<<ap->aa<<endl;
    }

    输出:

    base print
    12 34
    A print
    12 34 65

    要注意的是Base类型变量必须是A的第一个成员变量!

    这种用法在Android源码的HAL中经常用到,上面的Base可以作为一个函数接口的规范参数,但是传入的却是另一种类型,在函数中按Base类型处理,后面又可以将其强制转换成原本的类型A处理。这也你就可以扩展Base类型了,感觉与继承的效果有些类似。

  • 相关阅读:
    php echo return exit 区别
    Ubuntu下添加开机启动项的2种方法
    在php中定义常量时,const与define的区别
    yii分页操作
    ubuntu14.04设置静态ip
    Yii IIS8下使用伪静态【Url Rewrite】去掉index.php
    java 第三方库
    IDEA插件
    springboot扫描通用的依赖模块
    idea注册
  • 原文地址:https://www.cnblogs.com/albert1017/p/3939414.html
Copyright © 2011-2022 走看看