一种在C++中外部强行访问私有成员的方法

2024-09-06 23:08

本文主要是介绍一种在C++中外部强行访问私有成员的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

C++在设计上,是不允许类的私有成员在外部被访问读写的。
在这里插入图片描述

然而,有时是想要在外部访问私有成员的。我目前常见的情况是:想要访问UE引擎代码中的类的私有成员,但又不想“污染”其源代码将其private改为public。

方法

一种方法是,再建立一个完全相同结构的类,只不过将成员改为public:

class MyClassA_MirrorPublic
{
public:int data1;int data2;int data3;
public:MyClassA_MirrorPublic(){}
};

这样,每个成员的内存地址是一致的。

然后,在访问时,转换为这个新类型的指针进行访问:

//转换为新创建的类的指针:
MyClassA_MirrorPublic* pa = (MyClassA_MirrorPublic*)&a;
//读写:
cout << pa->data3 << endl;	//读
pa->data3 = 9;				//写
a.showData();				//测试原对象的成员是否真的被修改了

这样就可以顺利读写了:
在这里插入图片描述

完整代码

#include<iostream>
using namespace std;//想要访问的类
class MyClassA
{
private:int data1;int data2;int data3;
public:MyClassA(){data1 = 7;data2 = 0;data3 = 5;}void showData(){cout << "data3:" << data3 << endl;}
};//新创建一个具有完全相同结构的类,只不过将成员改为public
class MyClassA_MirrorPublic
{
public:int data1;int data2;int data3;
public:MyClassA_MirrorPublic(){}
};int main()
{MyClassA a;//转换为新创建的类的指针:MyClassA_MirrorPublic* pa = (MyClassA_MirrorPublic*)&a;//读写:cout << pa->data3 << endl;	//读pa->data3 = 9;				//写a.showData();				//测试原对象的成员是否真的被修改了
}

这篇关于一种在C++中外部强行访问私有成员的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143380

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at