class 私有变量多于1个成员变量的设置方法

Way to set private variable of class having more than one member variable

因为我们可以像this

那样设置class的私有变量

我试图为以下情况设置私有成员变量 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

这纯粹是 hack,不是有效的学习方法。

为什么不起作用

真的只是永远不要写这样的代码。有一种方法可以设置私有数据,那就是通过 class 上的 public 成员。否则,它是私人的是有原因的。这是 C++,实际上有非 UB 的方法可以做到这一点,但我不会在这里 link 它们,因为没有。

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

提示:ptr + sizeof(string) 是什么意思,因为 ptrint*ptr 在这一行之后指向什么?

我想这会解决问题:

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

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

如果您想继续阅读:C pointer arithmetic article

只是重申一下我认为你说过的话:你只是在四处闲逛作为学习的一个点,你知道在现实生活中你永远不应该这样做......!!

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

#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;
}