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类型了,感觉与继承的效果有些类似。

  • 相关阅读:
    下载文件
    Cookie方法
    阿拉伯数字转大写
    格式化日期
    正向代理与反向代理
    get post 区别
    gulp
    什么是javascript中的同步&&异步?
    懒加载
    js操作dom时发生了什么?
  • 原文地址:https://www.cnblogs.com/albert1017/p/3939414.html
Copyright © 2011-2022 走看看