Klassenkonzept private/public



  • Hallo,

    ich beschäftige mich seit gestern etwas mit Klassen, verstehe aber die Sache mit private/public noch nicht ganz. Nach welchen Kriterien deklariert man unter private oder public?

    Kann ich für den Anfang nicht alles unter public machen?



  • Du solltest nur public machen, was public sein muss (also was der Benutzer der Klasse braucht). Was man ja oft verhindern möchte, ist die unkontrollierte Änderung von Variablen (Eigenschaften der Klasse). Also versteckt man die eigentliche Variable, die den Wert enthält, und bietet dem Benutzer sogenannte Setter und Getter (zum Setzen der Variable bzw. zum Abfragen), die den übergebenen Wert auf Gültigkeit überprüfen und ggf. noch mehr damit anstellen. So verhindert man, dass der Benutzer Werte setzt, die nie von einem vorgesehen waren und zu Laufzeitfehlern oder undefiniertem Verhalten führen könnten. Außerdem schaffst du dir so die Möglichkeit, den Typ der Variablen jederzeit ändern zu können, ohne die Schnittstellen nach außen hin anfassen zu müssen.

    Um es auf den Punkt zu bringen: alles, was der Benutzer der Klasse braucht, muss public sein, alles andere sollte private sein. protected lassen wir hier mal außen vor...



  • Bin mir nicht sicher, ob ich es richtig verstanden habe. Also Variablen, die sich nicht mehr ändern sollen, werden private?



  • Nein hast du nicht! "Nicht verändern" -> const.
    private Variablen sollen sich sehrwohl ändern können. private heißt "privat" - das geht niemanden außer mich was an - ich kontrolliere, wer wie darauf zugreift.
    Ich würde aber sagen, du solltest dich mit einem Buch befassen, dort sollte auch ein Beispiel drin stehen.



  • Mal ein ganz billiges, kleines Beispiel...

    Nicht so gut:

    class CDivision {
    public:
    	int dividend;  //alles schön public!
    	int divisor;
    
    	CDivision() : dividend(0), divisor(1) {}
    	double GetErgebnis() { return (double)dividend/divisor; }
    };
    
    int main()
    {
    	CDivision c;
    	c.dividend=1;  //der User kann mit den Klassenvariablen machen, was er will...
    	c.divisor=0;
    	double res=c.GetErgebnis();  //es wird durch 0 geteilt => böse!
    }
    

    Schon besser:

    class CDivision {
    private:
    	int dividend;	//private, der User kann also nicht direkt darauf zugreifen
    	int divisor;
    
    public:
    	CDivision() : dividend(0), divisor(1) {}
    	bool SetDivisor(int val) {
    		if(val!=0) {
    			divisor=val;
    			return true;
    		} else {
    			return false;
    		}
    	}
    	void SetDividend(int val) { dividend=val; }
    	double GetErgebnis() { return (double)dividend/divisor; }
    };
    
    int main()
    {
    	CDivision c;
    	c.SetDividend(1);
    	bool hatGeklappt=c.SetDivisor(0);	//0 kann nicht gesetzt werden, weil es vom Setter überprüft
    	                                        //wird. Dem User wird das hier über den Rückgabewert mitgeteilt, den er abfragen kann.
    	if(hatGeklappt) {
    		double res=c.GetErgebnis();
    	}
    }
    


  • lemon03 schrieb:

    Nach welchen Kriterien deklariert man unter private oder public?

    Einfachste Faustregel "für den Anfang": Alle Membervariablen private, alle Memberfunktionen public.

    Der Bedarf nach privaten Memberfunktionen (Hilfsfunktionen) kommt dann recht schnell dazu, wenn man mit Vererbung arbeitet braucht man eventuell auch protected Memberfunktionen.

    Dem Drang, Membervariablen protected oder public zu machen sollte man möglichst widerstehen, das ergibt nicht sehr oft Sinn, da man die Variable der Kontrolle der Klasse entzieht und die Abstraktion, die die Klasse verkörpert, zerstört.



  • lemon03 schrieb:

    ...verstehe aber die Sache mit private/public noch nicht ganz.

    Schalt kurz von der Programmierung ab, und schau dir ein Technisches Gerät wie z.B. einen DVD-Player an. Dieser hat eine Schnittstelle nach außen hin (Knöpfe, IR-Empfänger...) und wenn man ihn aufschrauben würde, würde man Platinen etc. erkennen.

    Übertragen auf die Programmierung wäre die öffentliche Schnittstelle das, was du public machen musst (Kann von außerhalb der Klasse verändert werden), das Innenleben private (Kann nur innerhalb der Klasse direkt aufgerufen/verändert werden [indirekt aber über die öffentliche Schnittstelle]).

    Mach immer das public, was andere von dieser Klasse verwenden sollen, alles andere erst einmal privat. Grundsätzlich ist es nachträglich immer einfacher etwas privates öffentlich zu machen, als umgekehrt (daher würde ich an den Stellen, wo du dir unsicher bist, im Zweifel immer zuerst private verwenden, verändern kann man es immer noch).



  • Ok danke soweit. Bis ich da mehr durchblicke, halte ich mich erst mal dadran:

    Bashar schrieb:

    Einfachste Faustregel "für den Anfang": Alle Membervariablen private, alle Memberfunktionen public.


Anmelden zum Antworten