在仅拿到头文件的情况下,如何修改类中的私有成员值?

1 通过使用从对象开始处的硬编码/手工编码的偏移量构造指针来访问私有成员数据

class Weak
{
public:
    Weak() = default;
    ~Weak() = default;
        // 想想如果去掉该函数,外部想修改类中的私有成员变量 m_name 时该如何操作?
    void name(const std::string &name) {
        m_name = name;
    }
    std::string name() const {
        return m_name;
    }
private:
    std::string m_name;
};

struct Hacker
{
    std::string name;
};

int main()
{
    Weak w;
    w.name("zeros");
    std::cout << w.name() << std::endl;

        // 通过构造一个和类布局一样的结构体,通过指针偏移来修改类中的私有成员函数。
    Hacker *hacker = reinterpret_cast<Hacker*>(&w);
    hacker->name = "xiaoyu";
    std::cout << w.name() << std::endl;
        return 0;
}

2 . 使用联合体 union

class Point
{
public:
    void print() {
        std::cout << x << "x" << y << std::endl;
    }
private:
    int x, y;
};

class Proxy
{
public:
    void print() {
        std::cout << x << "x" << y << std::endl;
    }
public:
    int x,y;
};

int main()
{
    union
    {
        Point a;
        Proxy b;
    } x;
    x.a = Point();
    x.b.x = 3;
    x.b.y = 5;
    x.a.print();
        return 0;
}

原文地址:https://www.cnblogs.com/cheungxiongwei/p/12099471.html

时间: 2024-10-08 02:49:54

在仅拿到头文件的情况下,如何修改类中的私有成员值?的相关文章

[VS] - &quot;包含了重复的“Content”项。.NET SDK 默认情况下包括你项目中的“Content”项。&quot; 之解决

背景 VS 2017 升级至  VS 2017 v15.3 后,.Net Core 1.1 应用编译报错: Error: 包含了重复的"Content"项..NET SDK 默认情况下包括你项目中的"Content"项.可以从项目文件中删除这些项,或者如果希望将其显示包含在项目文件中,则可以将"EnableDefaultContentItems"属性设置为"false". Error : Duplicate 'Content'

定时删除文件夹&quot;$1&quot;下最后修改时间大于当前时间&quot;$2&quot;天的文件

shell 脚本: #!/bin/bash now=`date "+%Y-%m-%d_%H:%M:%S"`      #获取当前时间 echo "当前时间: "$now now=`date +%s`            #获取当前时间戳   单位:秒 echo "当前时间戳: "$now function getdir(){          #遍历文件夹和文件夹下所有的文件 #    echo "删除文件夹"$1"

在不允许新建对象的条件下,将list中指定条件的值去除

package com.liujianwang.learning; import java.util.LinkedList; import java.util.List; public class ListTest { public static void main(String[] args) { /* * 在不允许新建对象的条件下,将list中指定条件的值去除. * 例如:移除list中值大于6的元素. */ //测试数据 List<Integer> list = new LinkedLi

怎样在不处理的情况下在ABBYY FineReader中添加图像

可使用快速扫描窗口中的快速打开.扫描并保存为图像或任务自动化任务在没有进行预处理和 OCR 的ABBYY FineReader 中扫描或打开图像.如果你发现文档非常大,而你只需要识别其中的几个页面,就可以派上用场. 若有疑问可直接访问:http://www.abbyychina.com/FRshiyongjiqiao/fr-buchuli-tianjia.html 1. 在色彩模式下拉列表中,选择全彩色或黑白模式. 重要!当文档转换为黑白之后,您不能恢复彩色. 2. 单击所需的自动化任务: o

什么情况下才要重写Objective-C中的description方法

特别注意: 千万不要在description方法中同时使用%@和self,同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法 1.NSLog回顾   大家都知道,我们可以用NSLog函数来输出字符串和一些基本数据类 1 int age = 11; 2 NSLog( @" age is %d", age); * 第2行的%d代表会输出一个整型数据,右边的变量age会代替%d的位置进行输出 * 输出结果

CSS - 怎么样在不同分辨率的情况下计算根元素需要的font-size的值

一般我们做页面,肯定都会有设计图,移动端页面,一般情况下,UI出图都会定宽为640px,这也是移动端的标准尺寸:但是,我们也不能排除可能有其他特殊的情况可能需要做其他大小的设计图.所以,我们可以先定一个基准,然后来看看isux团队的整理出来的一个表格: 通过表格,我们能很清楚的看出各种分辨率下该如何计算,例如:320下的html的font-size就应该为320/640=0.5 所以,当以640为基准的font-size是20px时,我们就应该给320的定义为10px 转载 https://ww

【Golang】如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值

当你从客户端接收到一串序列化后的数据,你需要 - 修改其中某一个标签的值,然后把它传递到真正的业务数据,这样每个业务模块(微服务)就不需要和公共授权服务打交道了. - 因为传递的数据的长度,类型甚至是新的字段的新增的造成不稳定,因此 network->originBytes - > Marshal() -> Object -> Unmarshal()->newBytes->Logic Service 会造成很大的损耗 因此设想是否考虑一个优化方式: network-&g

自定义ListView适配器Adapter引用布局文件的情况下实现点击列表项时背景颜色为灰色

listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文件不做任何处理的话,点击列表项的时候不会出现背景色灰色的现象. 实现思路是:在listitem布局文件中为该布局文件中的父控件:LinearLayout,设置android:background="@drawable/listitemclickseletor" 其中listitemclic

在Oracle实例关闭情况下如何修改spfile的参数

重要说明:由于本文由本人测试并完成,其中可能还有不足之处,另外不同的环境可能也有不同的解决方法,本文仅供参考,并欢迎指证 问题描述: 在11G单机ASM中修改sga大小,修改完后,关闭instance并startup时,提示sga没有达到最小值,因些无法启动,而此时数据库实例已经关闭,已不能在之前的那种模式修改参数,具体的操作如下: 1.查询sga大小 SQL> show parameter sga NAME                     TYPE     VALUE --------