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

C++ 设置具有多个成员变量的类的私有变量的方法,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

因为我们可以将类的私有变量设置为

我试图为下面的情况设置私有成员变量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;
}
#包括
#包括
使用名称空间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你只是有一些未定义的行为,所以询问这些事情是非常徒劳的。如果有人在面试中问你这类事情,一个合理的反应是说“谢谢”然后走开。你不想在那里工作。不,除了忽略任何可能的填充之外,这违反了并且是未定义的行为。@AndrewHenle
char*
?@Muscampester它被转换回
int*
,然后取消引用。@AndrewHenle是的,但该地址的数据是
int
(或者,如果我们忽略了填充问题,至少应该如此)。因此,我很想知道这里是否违反了严格的别名规则。@Muscampester考虑到对齐限制会导致填充,我认为这是正确的。