2016-06-14 4 views
0

아래 코드를 확인하십시오. 클래스 A의 개인 데이터 멤버의 수정을 제한하는 해결책이 필요합니다. 제안하십시오.C++에서 개체의 개인 데이터 멤버 수정을 제한하는 방법?

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; 
} 
+3

여기에 문제가 없습니다. 프로그램에 정의되지 않은 동작이 있습니다. –

+0

멤버 변수에 액세스하는 것과 같은 오프셋을 가정 할 수는 없습니다. [오프셋을 결정하는 방법] (https://stackoverflow.com/questions/13180842/how-to-calculate-offset-of-a-class-member-at-compile-time)이 있지만 간단히 가정 할 수는 없습니다. 패딩, vtable 등으로 인한 가치. [here] (https://stackoverflow.com/questions/12378271/what-does-an-object-look-like-in-memory) – CoryKramer

답변

2

누군가가 '뒤틀리는'포인터를 막을 수있는 방법은 없습니다. private 데이터가 의도적으로 또는 악의적으로 수정되는 것을 방지 할 수 없으며 실수로 클래스 사용자가 수정 한 것일뿐입니다.

물론 데이터를 읽기 전용 메모리에 저장하지 않으면 ... OS에서 메모리를 가져 와서 데이터를 넣은 다음 OS에서 메모리를 읽기 전용으로 표시 할 수 있습니다 - 그런 다음에만 포인터를 데이터에 '게시'합니다. 물론, 당신은 불량 포인터를 통해 개체에 대한 명백한 손상의보다

0

귀하의 코드 샘플은 개인 데이터 멤버의 적은 약 수정입니다 ... 중 데이터를 수정할 수 없습니다. 미친 프로그래머 나 악의적 인 프로그래머가 그렇게하지 못하도록 C++에 실용적인 방법이 있다고 생각하지 않습니다.

private은 정상적인 클라이언트가 실수로 개체의 내부 상태를 깨지 못하게하는 것을 목표로합니다. 좋은 일을하고 싶지 않은 사람들은 어쨌든 #define private public을 할 수 있습니다.

나는 다른 주제와 관련이 Herb Sutter에 의해 견적을 생각 나게 해요하지만 난 그게 꽤 잘 문제를 해결 생각 : 우리의 관심사는 머피, Machiavelli-하지으로부터 보호하는 것입니다,

가 기억 고의적 인 범죄가 아니라 벌레와 실수에 대비하여 그러한 병적 인 학대가 후자의 범주에 해당됩니다.