C++ 设置具有多个成员变量的类的私有变量的方法
因为我们可以将类的私有变量设置为 我试图为下面的情况设置私有成员变量intC++ 设置具有多个成员变量的类的私有变量的方法,c++,class,private-members,C++,Class,Private Members,因为我们可以将类的私有变量设置为 我试图为下面的情况设置私有成员变量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 ma
#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;
}
#包括
#包括
使用名称空间std;
课堂测试
{
私人:
字符串s;
int数据;
公众:
Test():s(“新”),数据(0){
int getData(){return data;}
};
int main()
{
试验t;
int*ptr=(int*)&t;
*(ptr+sizeof(字符串))=10;
不知道为什么它不起作用
实际上从来没有编写这样的代码。有一种方法可以设置私有数据,这是通过类上的公共成员来设置的。否则,它是私有的。这是C++,实际上有非UB的方式来做这件事,但是我不打算在这里链接它们,因为不。
为什么它不起作用,特别是
提示:ptr+sizeof(string)
对于ptr
作为int*
的实际含义是什么?ptr
在这行后面指的是什么?我想这会解决问题:
char* ptr = (char*)&t;
*(int*)(ptr+sizeof(string)) = 10;
sizeof将返回以字节为单位的大小。指针增量将表示其指向的对象的大小。char是以字节为单位的大小
如果您想了解它:
只是重申一下我认为你说过的话:你只是作为一个学习点,你知道在现实生活中不可能这样做…!!指针算术应该用字节指针,而不是整数指针来完成
#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;
}
#包括
#包括
使用名称空间std;
课堂测试
{
私人:
字符串s;
int数据;
公众:
Test(){s=“New”,data=0;}
int getData(){return data;}
};
int main()
{
试验t;
char*ptr=(char*)&t;
*(int*)(ptr+sizeof(string))=10;
COTA不是C++中的语句分隔符。也许您在寻找分号?也考虑成员初始化列表。此外,您在主< <代码>中使用的代码是危险和损坏的。为什么要这样做?是尝试用指针和偏移量分配给对象中的特定字段,我不依赖于W。在一般情况下工作。@CodyGray看起来他们在main
中进行的黑客攻击是一种尝试性的解决方法,试图使用(错误地)分配给private
成员假定的内存布局object@Swapnil你只是有一些未定义的行为,所以询问这些事情是非常徒劳的。如果有人在面试中问你这类事情,一个合理的反应是说“谢谢”然后走开。你不想在那里工作。不,除了忽略任何可能的填充之外,这违反了并且是未定义的行为。@AndrewHenlechar*
?@Muscampester它被转换回int*
,然后取消引用。@AndrewHenle是的,但该地址的数据是int
(或者,如果我们忽略了填充问题,至少应该如此)。因此,我很想知道这里是否违反了严格的别名规则。@Muscampester考虑到对齐限制会导致填充,我认为这是正确的。