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博客
相关文章:
C++ 类 根据成员变量的指针获取类对象的指针
一.宏定义 实现方式有多种,原理是相同的 方式1: #define get_class_ptr(memberPtr,classType,memberName) \ ((classType*)((char*)(memberPtr)-(unsigned long)((ULONG_PTR)&((classType*)0)->member))) 方式2: #define get_cl…...
图论08-图的建模-状态的表达与理解 - 倒水问题为例
文章目录 状态的表达例题1题解1 终止条件:有一个数位为42 状态的改变:a表示十位数,b表示个位数3 其他设置 例题2 力扣773 滑动谜题JavaC 状态的表达 例题1 从初始的(x,y)状态,到最后变成(4,&am…...
sqlserver字符串拼接
本文主要介绍了sqlserver字符串拼接的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 1. 概 在SQL语句中经常需要进行字符串拼接,以sqlserver,oracle,mysql三种数据库为例&#…...
MySQL-----事务
事务的概念 事务是一种机制,一个操作序列。包含了一组数据库的操作命令,所有的命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行。 是一个不可分割的单位 事务的ACID特点 ACID,是指在可…...
hive的安装配置笔记
1.上传hive安装包 2.解压 3.配置Hive(在一台机器上即可) mv hive-env.sh.template hive-env.sh 4.运行hive 发现内置默认的metastore存在问题(1.换执行路径后,原来的表不存在了。2.只能有一个用户访问同一个表) 5.配置mysql的meta…...
lamba stream处理集合
lamba stream处理集合 带拼接多字段分组List< Object> 转 Map<String,List< Object>> Map<String, List<ProfitAndLossMapping>> collect plMappingList.stream() .collect(Collectors.groupingBy(m -> m.getLosType() ":" m.…...
操作系统 day04(系统调用)
什么是系统调用 库函数和系统调用的区别 应用程序可以通过汇编语言直接进行系统调用,也可以使用高级语言的库函数来进行系统调用。而有的库函数涉及系统调用,如“创建一个新文件”函数,有的不涉及,如“取绝对值”函数 什么功能要…...
【深度学习】pytorch——线性回归
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 深度学习专栏链接: http://t.csdnimg.cn/dscW7 pytorch——线性回归 线性回归简介公式说明完整代码代码解释 线性回归简介 线性回归是一种用于建立特征和目标变量之间线性关系的统计学习方法。它假设…...
golang工程——中间件redis,单节点集群部署
单节点redis集群部署 部署redis 6.2.7版本 没资源,就用一台机子部 解压安装包 tar zxf redis-6.2.7.tar.gzcd redis-6.2.7编译安装 mkdir -p /var/local/redis-6.2.7/{data,conf,logs,pid}data:数据目录 conf:配置文件目录 logs…...
Lua基础
table 基本原理: table是一种特殊的容器,可以向数组一样按照索引存取,也能按照键值对存取。 local mytable {1,2,3} --相当于数组 local mytable {[1]1,[2]2,[3]3} --和上面等价 local mytable {1,2,3,[3] 4} --隐式赋值会覆盖掉显式赋…...
微信小程序之开发工具介绍
一、微信小程序开发工具下载 微信小程序开发工具下载可以参考这篇博客《微信小程序开发者工具下载-CSDN博客》 二、开发工具组成部分 如下图所示,开发者工具主要由菜单栏、工具栏、模拟器、编辑器和调试器 5 个部分组成。。 1、菜单栏 菜单栏中主要包括项目、文…...
【AUTOSAR】【以太网】DoIp
AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读217次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、功能描述 2.1 Do...
游戏中UI的性能优化手段
UI方面有许多性能优化的技术或手段,以下是其中一些常见的例子: 惰性加载:对于长列表、大图等需要加载大量数据和资源的组件,可以采用惰性加载的方式,即在用户需要时再进行加载。这样可以减少初始加载时间和内存占用&am…...
Idea快速生成测试类
例如写写完一个功能类,需要对里面方法进行测试 在当前页面 按住CTRLSHFITT 选择你要生成的测试方法 点击OK,就会在test目录下在你对应包下生成对应测试类...
Java文件操作详解
CONTENTS 1. 文件和目录路径1.1 获取Path的片段1.2 获取Path信息1.3 添加或删除路径片段 2. 文件系统3. 查找文件4. 读写文件 1. 文件和目录路径 Path 对象代表的是一个文件或目录的路径,它是在不同的操作系统和文件系统之上的抽象。它的目的是,在构建路…...
二叉树系列主题Code
Python实现二叉树遍历 # 定义二叉树节点类 class TreeNode: def __init__(self, val0, leftNone, rightNone): self.val val self.left left self.right right # 前序遍历(非递归) def preorderTraversal(root): if not root: return [] …...
Leetcode 673. 最长递增子序列的个数 C++
673最长递增子序列的个数 给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: …...
html用css grid实现自适应四宫格放视频
想同时播放四个本地视频: 四宫格;自式应,即放缩浏览器时,四宫格也跟着放缩;尽量填满页面(F11 浏览器全屏时可以填满整个屏幕)。 在 html 中放视频用 video 标签,参考 [1]࿱…...
【机器学习可解释性】5.SHAP值的高级使用
机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP值的高级使用 正文 汇总SHAP值以获得更详细的模型解释 总体回顾 我们从学习排列重要性和部分依赖图开始,以显示学习后的模型的内容。 然后我们学习了SHAP值来分解单个预测的组成部…...
CentOS开机自动运行jar程序实现
前面已经有一篇文章介绍jar包如何在CentOS上运行,《在linux上运行jar程序操作记录》 后来发现系统重启后不能自动运行,导致每次都要手动打开,这篇介绍如何自动开机启动运行jar程序。 一、找到JDK程序执行位置 [rootlocalhost /]# which jav…...
iptables实战指南:从链表关系到规则配置的完整解析
1. iptables基础概念与核心组件 第一次接触iptables时,我盯着那些复杂的规则配置看了整整一个下午。后来才发现,理解iptables的关键在于掌握它的"四表五链"架构。简单来说,iptables就像是一个多层安检系统,数据包要经过…...
用LED条形图可视化74HC154译码效果:STC89C52项目入门指南
用LED条形图可视化74HC154译码效果:STC89C52项目入门指南 第一次接触单片机时,看到那些闪烁的LED灯总让人充满好奇——它们是怎么按照我们的想法亮起来的?今天我们就用STC89C52单片机和74HC154译码器,亲手搭建一个会"跳舞&q…...
PyTorch 2.8镜像工业设计:CAD图纸→AI生成产品渲染视频→营销素材输出
PyTorch 2.8镜像工业设计:CAD图纸→AI生成产品渲染视频→营销素材输出 1. 工业设计新范式:从CAD到营销视频的全流程AI化 传统工业设计流程中,从CAD图纸到产品营销素材的转化往往需要耗费大量时间和人力成本。设计师需要先完成3D建模&#x…...
千问3.5-2B多场景落地:电商商品图识别、医疗报告图释义、工业缺陷初筛
千问3.5-2B多场景落地:电商商品图识别、医疗报告图释义、工业缺陷初筛 1. 开箱即用的视觉理解工具 千问3.5-2B是Qwen系列中的小型视觉语言模型,它能够理解图片内容并生成相关文本描述。这个工具特别适合需要快速处理图片信息的场景,比如电商…...
【等保三级Java安全加固实战指南】:20年专家亲授7大高危漏洞修复清单与合规落地路径
第一章:等保三级Java安全加固的合规基线与实施全景图等保三级对Java应用系统提出了覆盖身份鉴别、访问控制、安全审计、通信保密性、代码安全及运行环境防护等多维度强制性要求。其合规基线并非单一技术点的叠加,而是以《GB/T 22239-2019 信息安全技术 网…...
饭局下半场,别人忙着解酒,我从开局就赢在酒杯里
1. 饭局如战场,后半场才是真正的考验任何一场饭局,都可以被分成两个阶段。前半场,推杯换盏,人人意气风发。酒过三巡,大家还在比拼谁喝得多、谁喝得猛,气氛热烈而体面。但到了后半场,画风开始分裂…...
GAN训练过程可视化神器对比:GAN Lab和TensorFlow Playground到底怎么选?
GAN训练可视化工具深度评测:从交互设计到教学效果的全面对比 当开发者第一次接触生成对抗网络(GAN)时,往往会被其复杂的对抗训练机制所困扰。传统的静态图表和数学公式很难直观展示生成器与判别器之间微妙的博弈过程。这正是可视化…...
Starry Night Art Gallery效果展示:黄金渐变按钮交互+实时生成反馈
Starry Night Art Gallery效果展示:黄金渐变按钮交互实时生成反馈 1. 沉浸式艺术体验:当AI遇见文艺复兴 想象一下,你走进的不是一个冰冷的AI工具界面,而是一座数字艺术殿堂。四周是深邃的墨蓝色背景,如同梵高笔下的夜…...
Qwen3.5-2B入门指南:如何将本地7860服务映射为公网可访问API接口
Qwen3.5-2B入门指南:如何将本地7860服务映射为公网可访问API接口 1. 引言 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。这个模型主打低功耗、低门槛部署,特别适合在端侧和…...
Halcon清晰度检测实战:5种算法全解析,手把手教你选出最清晰的PCB图像
Halcon清晰度检测实战:5种算法全解析,手把手教你选出最清晰的PCB图像 在工业视觉检测领域,PCB板的图像清晰度直接影响缺陷检测的准确率。当相机对焦不准确或存在景深限制时,如何从多张候选图像中自动选择最清晰的一张,…...
