【问题标题】:How to restrict objects private data member modification in C++?如何在 C++ 中限制对象私有数据成员的修改?
【发布时间】:2016-10-15 02:12:35
【问题描述】:

请检查下面的代码,我需要一个解决方案来限制A类私有数据成员的修改。请提出建议。

class A{
private:
    int a;
    int b;

public:
    A(int i=0, int j=0):a(i),b(j){
        cout<<"A's constructor runs"<<endl;
    }
    void showVal(){
        cout<<"a: "<<a<<" b: "<<b<<endl;
    }
};

int main(){
    A ob1(10,20);
    ob1.showVal();

    int *ptr = (int*)&ob1;
    *(ptr+0)=1;
    *(ptr+1)=2;

    ob1.showVal();

    return 0;
}

【问题讨论】:

  • 这里没有问题。该程序具有未定义的行为。
  • 你不能只假设这样的偏移量来访问成员变量。有ways to determine the offsets,但由于填充、vtables 等原因,您不能简单地假设一个值。另请参阅here

标签: c++ oop private members


【解决方案1】:

您无法采取任何措施来防止有人像这样“扭曲”指针。您无法防止您的 private 数据被故意或恶意修改,只会被您班级的用户意外修改。

当然,除非您设法将数据存储到只读内存中...您可以从操作系统获取一些内存,将数据放入其中,然后让操作系统将内存标记为只读 - 并且然后才“发布”指向您的数据的指针。当然,你也不能修改你的数据……

【讨论】:

    【解决方案2】:

    您的代码示例不是关于私有数据成员的修改,而是关于通过流氓指针对对象的彻底损坏。我认为 C++ 中没有实用的方法来防止疯狂或邪恶的程序员这样做。

    private 旨在保护理智的客户免于意外破坏对象的内部状态。那些不想玩得很好的人可以直接#define private public

    我想起了 Herb Sutter 的一句话,它与不同的主题相关,但我认为它很好地解决了你的问题:

    请记住,我们关心的是防止墨菲,而不是马基雅维利——防止错误和错误,而不是故意犯罪——而这种病态的虐待属于后一类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2015-04-17
      • 2019-09-03
      • 2013-12-30
      相关资源
      最近更新 更多