【问题标题】:Accessing private members of a struct using offset of member variables使用成员变量的偏移量访问结构的私有成员
【发布时间】:2014-07-22 18:57:22
【问题描述】:

我正在阅读有关结构和结构填充的内容,并编写了这段代码。它使用与 a 的地址偏移来编辑结构的私有成员。这是否意味着您可以参加某人制作的课程并提取/更改私有变量和函数?

#include <iostream>
typedef struct x {
    int a; 
private:
    int b;
public:
//Init
    x(int a, int b) : a(a) , b(b){}

    void print(){
        //Print values
        std::cout << a << " " << b << std::endl;
    }
} x;

int main()
{
    struct x s(10,20) ;
    int *p = (int *)(((char*)&s)+4); //4 Byte offset from a (a is at base)
    s.print();
    (*p) +=1;
    s.print();

    //Stops terminal closing
    int junk;
    std::cin >> junk;
    return 1;
}

【问题讨论】:

  • 不,这只是未定义的行为
  • private 是为了防止墨菲,而不是马基雅维利。
  • 我已经用它来证明其他人的代码中存在错误(通过“修复”他们的私人成员数据)。更简洁的方法是使用新名称为类创建自己的标题,并且所有内容都是公开的,然后重新解释从一个到另一个的强制转换。只是,拜托,为了理智,这样做只是为了暂时的骇人听闻的目的。然而,知道这一点是件好事,因为否则人们会依赖私有来做它不做的事情。

标签: c++ struct


【解决方案1】:

C++ 的private 用于为抽象数据类型提供封装机制。它不是防止人们写出糟糕的代码,如果他们真的想要

【讨论】:

  • 是的,你完全可以做到这一点。我参加了一个关于如何利用它的研讨会。
【解决方案2】:

这是否意味着您可以参加某人制作的课程并提取/更改私有变量和函数?

C++ 标准对此类问题没有任何要求。具体来说,struct 中的对象大小没有要求。 int 的大小由实现定义。

这可能是个坏主意,而且很可能是设计的味道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2023-03-22
    • 2015-11-15
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多