private oder protected?



  • Hallo nochmal! 🙂

    Mir fällt es immer noch ein bisschen schwer zu erkennen, wann ich Membervariablen private, und wann protected setzen soll.

    Beispiel aus meinem Code. Es existiert eine Klasse Fahrzeug. Von dieser erben nun die Klasse PKW und Fahrrad.

    class Fahrzeug
    {
    public:
    	Fahrzeug();
    	Fahrzeug(const string sName);
    	Fahrzeug(const string sName, const double dMaxSpeed);
    	virtual ~Fahrzeug();
    	void vAusgabe();     //Fahrzeugdaten auslesen
    	void vAbfertigung(); //Fahrzeugstatus aktualsieren
    protected:
    	double p_dMaxGeschwindigkeit; //Maximalgeschwindigkeit
    	double p_dGesamtStrecke;    //Gesamte zurückgelegte Strecke
    	double p_dGesamtZeit;       //Gesamtzeit
    	double p_dZeit;             //Zeit seit letzer Bearbeitung
    private:
    	string p_sName; // Name des Fahrzeugs
    	int p_iID;      // ID des Fahrzeugs
    	static int p_iMaxID;	
    
    	void vInitialisierung(); //Init der Werte	
    };
    

    Was wäre hier klug? Habe schon 4 Member auf protected gesetzt? Welche Funktionen sollte man als virtual setzen?



  • Grundregel: Nie protected benutzen. Wenn eine erbende Klasse darauf Zugriff haben kann, dann kann man es in der Regel auch public machen. Mir fällt aus dem Kopf nicht mal ein Beispiel ein bei dem protected sinnvoll wäre, auch wenn es bestimmt irgendetwas gibt. Ist aber wie gesagt sehr, sehr selten.

    Zusatztipp: Versuche nicht die "Realität" in deiner Programmstruktur abzubilden. Nur weil alle Frauen Säugetiere sind und der Inhalt ihrer Handtaschen privat ist, heißt das nicht dass du dein Programm auch so aufbauen musst. Klassen und private/public dienen in erster Linie dazu Objekte (insbesondere Ressourcen-Handles wie Sockets/Speicher etc.) die man auch wirklich vor äußerem Zugriff schützen will zu verstecken. Wenn du einfach nur eine Sammlung von Eigenschaften hast dann nimm einfach ein struct. Das ist völlig ausreichend.



  • Das ist leider in einer Aufgabe gefordert. 😋
    Warum ist protected denn so furchtbar?



  • Krachi schrieb:

    Warum ist protected denn so furchtbar?

    Gegenfrag: Warum solltest du es jemals benutzen wollen.



  • protected ist nicht furchbar, es bringt aber auch nicht so viel. private bei einem Member begrenzt den Kreis derer, die davon abhängen, auf die Klassenmember und friends der Klasse, public begrenzt gar nicht. Auf wen begrenzt protected? Eigentlich auf abgeleitete Klassen, aber da Ableiten unbegrenzt möglich ist, ist auch der Abhängigkeitsradius von protected effektiv unbegrenzt.



  • protected ist sinnvoll, wenn eine Klasse als reine Basisklasse gedacht ist. Dann macht man Konstruktor (und u.U. Destruktor) protected.



  • Kellerautomat schrieb:

    protected ist sinnvoll, wenn eine Klasse als reine Basisklasse gedacht ist. Dann macht man Konstruktor (und u.U. Destruktor) das protected was nicht publich sein soll, die abgeleiteten Klassen aber verwenden können müssen.

    FTFY



  • War ja mal wieder klar, dass von dir so ein dummer Kommentar kommt. Ich werd mir einfach komplett das Posten in diesem Unterforum sparen, wenn man sich dann sone Kacke anhoeren muss.



  • cooky451 schrieb:

    Grundregel: Nie protected benutzen. Wenn eine erbende Klasse darauf Zugriff haben kann, dann kann man es in der Regel auch public machen. Mir fällt aus dem Kopf nicht mal ein Beispiel ein bei dem protected sinnvoll wäre, auch wenn es bestimmt irgendetwas gibt. Ist aber wie gesagt sehr, sehr selten.

    Was ist denn mit den ganzen GUI-Generatoren wie Qt oder wxWidgets? Da wird auch eine Basisklasse erzeugt, die alle GUI-Elemente enthält. Die GUI-Elemente werden dann protected vererbt.

    Ergebnis: Im editor kann der user die GUI schön anpassen und die Basisklasse generieren lassen, in der geerbten Klasse kann er auf die GUI-Elemente zugreifen, wobei die GUI-Elemente ja für andere Klasse nicht interessant sind (und daher private)



  • Ich benutze protected immer, wenn ich eine Klasse ableitbar gestalte, aber die protected Inhalte nicht public machen will, diese aber von einer (sinnvollen) abgeleiteten Klasse benötigt werden.



  • Ich habe eine gute Seite gefunden wo dies erklärt wird, unter Zugriffstecht:
    http://www.c-plusplus.net/forum/posting.php?mode=reply

    Sobald die abgeleitete Klasse für eine berechnung oder so die membervariablen der basisklasse benötigt kann man sie als protected setzen, um so auf sie zuzugreifen. Andernfalls müsste man sie public setztn wobei aber JEDER zugreifen darf. Das gleiche gilt für die Methoden.

    Lg
    Christof



  • Christof_12 schrieb:

    Ich habe eine gute Seite gefunden wo dies erklärt wird, unter Zugriffstecht:
    http://www.c-plusplus.net/forum/posting.php?mode=reply

    Sobald die abgeleitete Klasse für eine berechnung oder so die membervariablen der basisklasse benötigt kann man sie als protected setzen, um so auf sie zuzugreifen. Andernfalls müsste man sie public setztn wobei aber JEDER zugreifen darf. Das gleiche gilt für die Methoden.

    Lg
    Christof

    Oder für jeden daten member in der basis klasse einen getter und eventuell auch setter schreiben (diese methoden könnten dan protected sein, wenn nur abgleitete klassen daruf zugreifen sollen)


Log in to reply