设置具有多个成员变量的类的私有变量的方法

时间:2016-12-21 17:44:22

标签: c++ class private-members

我们可以像this

那样设置类的私有变量

我试图为下面的情况设置私有成员变量int。

#include <iostream>
#include <string>

using namespace std;

class Test
{
private:
    string s;
    int data;
public:
    Test() : s("New") , data(0) { }
    int getData() { return data; }
};

int main()
{
    Test t;
    int* ptr = (int*)&t;
    *(ptr+sizeof(string)) = 10;
    cout << t.getData();
    return 0;
}

但它无法打印10。

我知道还有其他方法可以使用setter函数设置它,但是检查使用显示的方法设置here

这纯粹是黑客攻击,但无法学习。

3 个答案:

答案 0 :(得分:4)

我认为这将解决它:

char* ptr = (char*)&t;
*(int*)(ptr+sizeof(string)) = 10;

sizeof将返回以字节为单位的大小。指针增量将指向其指向的对象的大小。 char是一个字节大小。

如果您想阅读它:C pointer arithmetic article

重申我认为你已经说过的话:你只是作为一个学习点进行黑客攻击,而且你知道在现实生活中你不可能做到这一点。 。!!

答案 1 :(得分:2)

为什么它不起作用

真的只是永远不会写这样的代码。有一种方法可以通过类中的公共成员设置私有数据。否则,出于某种原因,它是私有的。这是C ++,实际上有非UB方式这样做,但我不打算在这里链接它们,因为不要。

为什么它不起作用,特别是

提示:ptr + sizeof(string)实际上是什么意思,ptrint*ptr指向此行后的内容是什么?

答案 2 :(得分:1)

指针算法应该用字节指针完成,而不是整数指针。

#include <iostream>
#include <string>

using namespace std;

class Test
{
private:
    string s;
    int data;
public:
    Test() { s = "New", data = 0; }
    int getData() { return data; }
};

int main()
{
   Test t;
   char* ptr = (char*)&t;
   *(int*)(ptr+sizeof(string)) = 10;
   cout << t.getData();
   return 0;
}