当前位置: 首页 > news >正文

C++ 类 根据成员变量的指针获取类对象的指针

一.宏定义

实现方式有多种,原理是相同的

方式1:

#define get_class_ptr(memberPtr,classType,memberName) \
((classType*)((char*)(memberPtr)-(unsigned long)((ULONG_PTR)&((classType*)0)->member)))

方式2: 

#define get_class_ptr(memberPtr,classType,memberName) \
((classType*)(reinterpret_cast<char*>(memberPtr)-(unsigned long)&(reinterpret_cast<classType*>(0)->member)))

 实现原理:利用c++类的内存分布,初始化的类的成员变量在内存中的储存地址是基于类对象的地址的偏移值确定的,已知成员变量的内存地址,再减去类结构的各个成员变量基于类基址的偏移值,就可以计算出类对象的内存地址,不同的类结构,内存结构也不同,详情参考文末参考文章,讲解的比较详细

二.测试示例

以下代码属于类似伪代码,只描述大致流程,和特定场景使用

#define get_class_ptr(memberPtr,classType,memberName) \
((classType*)((char*)(memberPtr)-(unsigned long)((ULONG_PTR)&((classType*)0)->member)))class A
{
public:A();~A();
public:int m_TestOne;int m_TestTwo;
}class B
{
public:B(){m_aPtr=new A();}~B();
public:A *m_aPtr;int m_TestB;
}int main()
{//假设已经存在类B,且已初始化,但是由于某种原因不知道bObj的内存地址,//但是知道类成员aPtr的内存地址B *bObj=new B();A *aObjTem=bObj->m_aPtr//通过类B成员变量m_aPtr获取bObj的地址B *bObjTemp = get_class_ptr(aObjTem,B,m_aPtr);reurn 0;
}

三.参考文章:

1.根据类成员获取类指针_蓝黑墨水的博客-CSDN博客

2.【精选】C++ - 类的内存分配_c++类内存分布-CSDN博客

http://www.lryc.cn/news/216107.html

相关文章:

  • 图论08-图的建模-状态的表达与理解 - 倒水问题为例
  • sqlserver字符串拼接
  • MySQL-----事务
  • hive的安装配置笔记
  • lamba stream处理集合
  • 操作系统 day04(系统调用)
  • 【深度学习】pytorch——线性回归
  • golang工程——中间件redis,单节点集群部署
  • Lua基础
  • 微信小程序之开发工具介绍
  • 【AUTOSAR】【以太网】DoIp
  • 游戏中UI的性能优化手段
  • Idea快速生成测试类
  • Java文件操作详解
  • 二叉树系列主题Code
  • Leetcode 673. 最长递增子序列的个数 C++
  • html用css grid实现自适应四宫格放视频
  • 【机器学习可解释性】5.SHAP值的高级使用
  • CentOS开机自动运行jar程序实现
  • matlab双目标定中基线物理长度获取
  • 自己动手实现一个深度学习算法——二、神经网络的实现
  • gRPC源码剖析-Builder模式
  • ARM传输数据以及移位操作
  • 06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)
  • ngx_http_request_s
  • Docker 学习路线 2:底层技术
  • UEFI实战——显示图片
  • Ansible中的playbook
  • 怎样去除视频中的杂音,保留人声部分?
  • 基于Qt QTreeView|QTreeWidget控件使用简单版