2016-06-14 13 views
0

Bitte überprüfen Sie den untenstehenden Code, ich brauche eine Lösung, um die Änderung von privaten Daten Mitgliedern der Klasse A zu beschränken. Bitte schlagen Sie vor.Wie können Sie die Änderung der privaten Daten von Objekten in C++ einschränken?

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

Hier gibt es kein Problem. Das Programm hat ein undefiniertes Verhalten. –

+0

Sie können nicht einfach Offsets wie diesen für den Zugriff auf eine Membervariable annehmen. Es gibt [Möglichkeiten, die Offsets zu bestimmen] (https://stackoverflow.com/questions/13180842/how-to-calculate-offset-of-a-class-member-at-compile-time), aber Sie können nicht einfach annehmen, a Wert aufgrund von Padding, VTables usw. Siehe auch [hier] (https://StackOverflow.com/questions/12378271/what-does-an-object-look-like-in-memory) – CoryKramer

Antwort

2

Es gibt nichts, was Sie tun können, um zu verhindern, dass jemand solche Zeiger verzerrt. Sie können nicht verhindern, dass Ihre private Daten absichtlich oder böswillig geändert werden, nur versehentlich von Benutzern Ihrer Klasse geändert.

Es sei denn, Sie schaffen es, Ihre Daten im Nur-Lese-Speicher zu speichern ... Sie könnten etwas Speicher vom Betriebssystem bekommen, Ihre Daten hineinlegen und dann das Betriebssystem dazu bringen, den Speicher als schreibgeschützt zu markieren - und erst dann den Zeiger auf Ihre Daten veröffentlichen. Natürlich können Sie Ihre Daten nicht ändern entweder ...

0

Ihr Codebeispiel weniger über Modifikation ist privater Daten Mitglieder als es um geradezu Korruption eines Objekts über einen Rogue-Zeiger. Ich denke nicht, dass es einen praktischen Weg in C++ gibt, um verrückte oder böse Programmierer daran zu hindern, genau das zu tun.

private zielt darauf ab, gesunde Clients vor dem versehentlichen Brechen des internen Status Ihres Objekts zu schützen. Wer nicht schön spielen will, kann einfach #define private public machen.

ich an ein Zitat erinnert von Herb Sutter, die zu einem anderen Thema, aber ich denke, es behebt das Problem ziemlich gut:

Denken Sie daran, unser Anliegen gegen Murphy zu schützen, nicht Machiavelli- gegen Fehler und Fehler, nicht vorsätzliche Verbrechen - und solche pathologischen Mißbräuche fallen in die letztere Kategorie.