请检查以下代码,我需要一个解决方案来限制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;
}
答案 0 :(得分:2)
你无法阻止某人翘曲&#39;这样的指针。您无法阻止您的private
数据被故意或恶意修改,只会被您的班级用户意外修改。
除非您设法将数据存储到只读内存中......您可以从操作系统获取一些内存,将数据放入其中,然后让操作系统将内存标记为只读 - 并且只有这样才能发布&#39;指向数据的指针。当然,您无法修改数据......
答案 1 :(得分:0)
您的代码示例不是关于私有数据成员的修改,而是关于通过恶意指针对对象的直接损坏。我不认为在C ++中有一种实用的方法来防止疯狂或邪恶的程序员这样做。
private
旨在保护理智的客户不会意外地破坏对象的内部状态。那些不想玩得很好的人无论如何都可以做#define private public
。
我想起Herb Sutter引用的一句话,这与一个不同的主题有关但我认为它很好地解决了你的问题:
请记住,我们关注的是保护墨菲,而不是马基雅维利 - 防止错误和错误,而不是故意犯罪 - 这种病态滥用属于后一类。