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)
是什么意思,因为 ptr
是 int*
? 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;
}
因为我们可以像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)
是什么意思,因为 ptr
是 int*
? 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;
}