C++中直接存取类私有成员[360度]

使用C++实现在类中存储成员信息并实现存取 C++类实现成员信息动态存取 阅读详情
本文谈到的问题是,在C++中究竟有没有办法访问类的私有成员,以及如何实现。主要针对菜鸟,老鸟们就不要看了。

 读到《C++编程思想》48页,“3.4 对象布局”一节时,看到这样一段话:
 
 存取指定符是struct的一部分,他并不影响这个struct产生的对象,程序开始运行时,所有的存取指定信息都消失了。存取指定信息通常是在编译期间消失的。在程序运行期间,对象变成了一个存储区域,别无他物,因此,如果有人真的想破坏这些规则并且直接存取内存中的数据,就如在C中所做的那样,那么C++并不能防止他做这种不明智的事,它只是提供给人们一个更容易、更方便的方法。

 既然是在编译期间去掉了所有的存取限制属性,那么能不能设计一段代码绕过编译器的检查机制,又能在运行期间访问类的私有成员呢? 首先想到了条件转移语句——编译器对条件转移代码块的编译是否有可利用之处呢?虽然实验失败了,但我的第一想法确实是这个。示例代码如下:
//tester.h
//Demo class
class tester
{
public:
 tester() : i(5), ch('x'){};
private:
 int i;
 char ch;
};

//test1.cpp
//Demo testing code

#include "tester.h"
#include<conio.h>
#include<iostream>

using namespace std;

void main(void)
{
 tester myTester;
 char* p = NULL;

 if (1 > 0)
 {
  p = &myTester.ch;  //Here is the point
 }

 cout << "Address of ch = " << (void*) p << endl; //The type modifier void* forces it to output the
              //address, not its  content
 cout << "ch = " << * (p) << endl;

 getch();  //Waits your action
 * p = 'y';

 cout << "Now ch = " << * (p) << endl;
}
 结果正如上面所说,失败了:编译器报错:error C2248: 'ch' : cannot access private member declared in class 'tester'。不过这引发了更深一步的思考。C语言里面最活的就是指针了,平常最怕乱指的野指针,这一次就试试它!修改后的测试代码如下:

//test2.cpp
//Demo testing code

#include "tester.h"
#include<conio.h>
#include<iostream>

using namespace std;

void main(void)
{
 tester myTester;
 char* p = NULL;

 p = (char*) &myTester + sizeof(int);  //Here is the point! Jumps sizeof(int) units of bytes!

 cout << "Address of ch = " << (void*) p << endl; //The type modifier void* forces it to output the
              //address, not the content.
 cout << "ch = " << * (p) << endl;

 getch();  //Waits your action
 * p = 'y';

 cout << "Now ch = " << * (p) << endl;
}
 查看输出后可以发现,ch的内容已经修改了。不过通过指针强行访问类的私有成员确实有点那个,嘿嘿。

C++类成员反射实现 引出问题:给定一个我们自己定义的类A,如何便捷的输出其所有的成员变量类型及值。日常编程中有这样的需求,一个是为了调试,二个是为了在不同模块运行时得到类的属性用于显示及修改。但C++未提供原生的反射机制,所以有了以下思考。核心的需求为:对于一个类型A,我们可以拥有其所有的类型信息。例如: class A { int INT; float FLT; }/*MAIN*/ A a; a.IN 阅读详情

相关推荐

C++程序崩溃现场取证——backward-cpp实战指南

本文详细介绍了如何使用backward-cpp工具进行C++程序崩溃现场取证,包括其工作原理、安装集成方法及高级调试技巧。通过实战案例和代码示例,帮助开发者快速定位和解决程序崩溃问题,提升调试效率。backward-cpp作为一款高效的崩溃分析工具,特别适用于复杂环境下的C++开发。

weixin_29009501的博客 323

C++中直接存取类私有成员

 本文谈到的问题是,在C++中究竟有没有办法访问类的私有成员,以及如何实现。主要针对菜鸟,老鸟们就不要看了。 读到《C++编程思想》48页,“3.4 对象布局”一节时,看到这样一段话:  存取指定符是struct的一部分,他并不影响这个struct产生的对象,程序开始运行时,所有的存取指定信息都消失了。存取指定信息通常是在编译期间消失的。在程序运行期间,对象变成了一个存储区域,别无他物,因此,

Hakuna Matata 3904

UE4独立游戏开发:利用NVIDIA Ansel轻松生成360度全景宣传图

在游戏开发与计算机图形学领域,实时渲染与高质量视觉输出是核心技术追求。其原理在于通过图形API(如DirectX)驱动GPU,对3D场景进行光栅化与着色计算,最终生成像素图像。这项技术的核心价值在于能以交互式帧率呈现复杂逼真的虚拟世界,是游戏沉浸感的基础。其应用场景广泛,从游戏内截图、宣传素材制作到虚拟现实预览都不可或缺。针对独立游戏开发者面临的宣发素材制作难题,尤其是如何高效产出能全方位展示游戏场景魅力的内容,NVIDIA Ansel技术提供了一套优雅的解决方案。它本质上是一个集成在驱动层的高级截图SDK

weixin_30352191的博客 722

浅析C++中获取类私有对象的一种方式

纯属个人愚见,欢迎探讨          最近在为自己写的class做一些unit test,碰到为了验证一个私有变量的正确性,强忍住了为去修改class的冲动,尝试了直接冲内存获取对应字段值的方式,就在这里就当给自己记个笔记了   class A{ public: A(int a){test = &a;} ~A(){} private: ch

zhaoyunfan的专栏 882

【花雕学编程】Arduino ESP32 SPP 之使用Servo库控制360度舵机正反转

使用 Servo 库控制 360 度舵机的正反转是 Arduino ESP32 SPP 应用中的一个重要案例,具有简易控制接口、灵活速度调节和高兼容性等特点,广泛应用于机器人、自动化装置和动态艺术等领域。在第三个案例中,使用map()函数将用户输入的速度参数(范围0-100)映射到舵机控制的角度(0-180),使得用户能够以更人性化的方式控制舵机速度。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

雕爷学编程 1469

Qt框架实现模拟360度界面项目

在Qt中,除了内置的事件类型之外,开发者还可以创建和分发自定义事件。自定义事件为应用程序提供了额外的灵活性,使得开发者可以根据需要定义新的事件类型来响应特定的应用场景。创建自定义事件通常需要继承自QEvent类,并为自定义事件类指定一个唯一的类型。当需要发送一个自定义事件时,创建该事件的实例并使用方法加入到事件队列中。public:// 自定义事件类型// 在某处创建并分发自定义事件在目标对象中,需要重写方法来处理这个事件。根据事件的类型执行相应的逻辑处理。

weixin_33597080的博客 948

从一个修改私有变量的问题想到的

前几天,在论坛里看到一个帖子,内容是:(原帖见:http://community.youkuaiyun.com/Expert/topic/5014/5014384.xml?temp=.3018152)========================================class a{private:int k;};要求不用友元,不在这个类里添加任何代码,去访问成员变量k。能做出的高手,请贴出完整源

小三的学习园地 978

c++在屏幕上显示0~360度的cos(x)

为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。

【花雕学编程】Arduino ESP32 SPP 之360度舵机的蓝牙控制

通过这种方式,你可以编写代码来控制 ESP32 的蓝牙功能,使其能够与其他蓝牙设备进行通信。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1)Arduino 开发环境:Arduino 提供了一套开发环境,包括编译器、IDE(集成开发环境)和各种库,使用户可以通过简单的代码来控制硬件。基于Arduino IDE的开发环境,提供了丰富的库和示例代码,使得开发者能够快速上手,简化了舵机控制程序的编写和调试过程。

雕爷学编程 1172

使用WSL2安装ubuntu系统并配置深度学习环境

wsl2安装ubuntu部署深度学习环境的方法

u013358093的博客 2703

简化神经元模型6 -- Hindmarsh-Rose Model

简化神经元模型 6 Hindmarsh-Rose Model

weixin_73557167的博客 1427

360全景拼接 opencv_360度全景图片制作教程,360度全景视频拍摄讲解

vr全景技术的应用如今是越来越多,“云生活”和“宅经济”在疫情之时也是赚足了眼球,能够将线下场景1:1还原到线上的vr全景自然也成了很多商企所找寻的数字化转型方式。那么这里也难免有朋友刚接触到这一技术和形式,360度全景图片是怎么制作的呢?360度全景视频又是怎么拍摄的?相信很多朋友对此都有所疑惑,下面我们就来一起看下吧。360度全景图片制作教程,360度全景视频拍摄讲解360度全景图片制作目前市...

weixin_42116805的博客 1840

Linux服务器上后台运行jupyter notebook/Lab

1 安装配置教程2 后台运行jupyter3 更改运行环境kernel4 SSH端口转发 1 安装配置教程 可以参考:https://www.cnblogs.com/thousfeet/p/10647102.html 2 后台运行jupyter screen -S jupyter # 新建一个名为jupyter的后台screen # 在base环境下,先 cd 到指定文件目录 jupyter notebook # or jupyter lab 3 更改运行环境kernel 需要手动为每个环境添加内.

strivequeen的博客 1837

【花雕学编程】Arduino ESP32 SPP 之通过蓝牙动态控制360度舵机

涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1)Arduino 开发环境:Arduino 提供了一套开发环境,包括编译器、IDE(集成开发环境)和各种库,使用户可以通过简单的代码来控制硬件。速度和方向控制: 在第二和第三个示例中,通过读取蓝牙数据中的速度和方向指令,动态调整舵机的运动速度和方向,确保舵机按照预定指令进行运动。

雕爷学编程 990

Unity中Newtonsoft.Json的使用(一)

在Unity中下载Newtonsoft.Json,并进行序列化和反序列化

洛苍离的博客 1万+

基于互联网的智能旧衣回收箱设计与实现

本文介绍了基于嵌入式系统的智能旧衣回收箱的设计与实现,涵盖了硬件设计、软件开发、图像识别、物联网连接等方面的内容。通过利用最新的技术,如图像识别、物联网和云计算,实现了智能、便捷的旧衣物回收系统。未来,随着技术的不断进步,智能回收系统将会在环保领域发挥更大的作用。

2201_76125393的博客 908

开源项目推荐:CFL - 360度图像的端到端布局恢复

开源项目推荐:CFL - 360度图像的端到端布局恢复 1. 项目基础介绍及主要编程语言 CFL(Corners for Layout)是一个用于从360度全景图像中恢复室内场景三维布局的开源项目。该项目基于TensorFlow框架,并使用了Python、C++和Shell等编程语言进行开发。CFL项目的目标是实现一种端到端的模型,能够通过全景图像自动恢复室内的三维布局信息。 2. 项目的核心功能...

gitblog_00544的博客 359

Java 实现 MP3 音频合并工具类:摆脱 FFmpeg,高效低 CPU 的纯本地方案【需求已解决】

本方案充分发挥了 Java 音频 SPI 的潜力,实现了轻量、跨平台、低 CPU 消耗的 MP3 音频合并工具类。 对于希望在服务器或桌面应用中集成音频处理功能的开发者而言,这无疑是一个可行且优雅的解决方案。

一键难忘的博客 546

虚幻UE4中如何采集360度全景图片和VR视频

如何使用虚幻4来制作一个VR视频播放器呢,简单来讲,使用虚幻4的视频采集插件来获取图像,并对图像进行处理,就能获取我们需要的图像了,下一步,你可以把图像投影到一个360度球体上,就能形成球形的播放器了。

虚拟现实开发 5436

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 81

ElectrolyteGPT:首个电池电解液逆向设计的生成式 AI 系统 —— 算法原理与复现解析

数据驱动的重要性:1100 万→100 万的精心筛选,比单纯增大模型更有效领域适配:fLine 表示法、正则分词、化学感知的数据增强(SMILES randomization)都是关键小模型的力量:6M 参数在特定化学空间的表现,远超通用大模型在相同任务上的零样本能力条件生成的极限:10 维条件导致模型崩溃,提示我们需要更好的条件编码策略(如 diffusion guidance、RLHF-style 偏好优化)未来方向配方实验验证。

ASKCOS博客 124

看完这篇,你也可以实现一个360度全景插件

导读本文从绘图基础开始讲起,详细介绍了如何使用 Three.js开发一个功能齐全的全景插件。我们先来看一下插件的效果:如果你对 Three.js已经很熟悉了,或者你想跳过...

lentoo的博客 3167

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

在屏幕上用“*”显示0~360度的余弦函数cos(x),sin(x)曲线

/*绘制余弦曲线: 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 问题分析与算法设计:关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个“*”。为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。

Shunrei的专栏 4652

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 数组实现

/*绘制余弦曲线: 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 */ #include#includeusing namespace std;int main(){ //数组实现:假设屏幕为21*62定义一个数组,全部归0,然后算,该有点的地方表为1,然后输出 coutdouble y; int i,j,m; int row=0; int flag[21][62]=

Shunrei的专栏 2064

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NVIDIA DeepStream 360度智能停车应用项目常见问题解决方案

NVIDIA DeepStream 360度智能停车应用项目常见问题解决方案 1. 项目基础介绍和主要编程语言 NVIDIA DeepStream 360度智能停车应用是一个开源项目,它基于NVIDIA DeepStream SDK构建,用于实现一个完整的端到端智能停车解决方案。该项目通过集成视频感知和数据统计分析,提供了实时监控和长期趋势分析等功能,适用于需要长期数据监控和实时反馈的停车场管理。...

gitblog_00827的博客 816

在屏幕上用“*”显示0~360度的三角函数cos(x)和sin(x)曲线

三角函数图像的绘制

yyzsir的博客 3610
上一篇: 怎样和朋友寒暄
下一篇: 用__asm写c函数[秋镇菜]
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值