Was ist der Unterschied zwischen privaten und geschützten Membern von C++-Klassen?

Lesezeit: 6 Minuten

Was ist der Unterschied zwischen privaten und geschutzten Membern von
Konrad

Was ist der Unterschied zwischen private und protected Mitglieder in C++-Klassen?

Ich verstehe aus Best-Practice-Konventionen, dass Variablen und Funktionen, die nicht außerhalb der Klasse aufgerufen werden, erstellt werden sollten private– aber wenn ich mir mein MFC-Projekt anschaue, scheint MFC zu bevorzugen protected.

Was ist der Unterschied und welchen sollte ich verwenden?

  • Wenn Sie eine Bibliothek entwerfen, ist jedes geschützte (und nicht private) Mitglied eine Verpflichtung. Wenn Sie bei internen Klassen alles schützen, was nicht öffentlich ist, sparen Sie Zeit und reduzieren die Notwendigkeit, Klassen erneut zu besuchen, um ein Mitglied von privat auf geschützt zu ändern.

    Benutzer4945014

    31. Juli 2021 um 22:33 Uhr

1646917807 316 Was ist der Unterschied zwischen privaten und geschutzten Membern von
Firas Assaad

Auf private Mitglieder kann nur innerhalb der sie definierenden Klasse zugegriffen werden.

Auf geschützte Member kann in der Klasse zugegriffen werden, die sie definiert, und in Klassen, die von dieser Klasse erben.

Bearbeiten: Beide sind auch für Freunde ihrer Klasse und im Fall von geschützten Mitgliedern für Freunde ihrer abgeleiteten Klassen zugänglich.

Bearbeiten 2: Verwenden Sie alles, was im Kontext Ihres Problems sinnvoll ist. Sie sollten versuchen, Mitglieder wann immer möglich privat zu machen, um die Kopplung zu reduzieren und die Implementierung der Basisklasse zu schützen, aber wenn das nicht möglich ist, verwenden Sie geschützte Mitglieder. Überprüfen Häufig gestellte Fragen zu C++ zum besseren Verständnis des Problems. Diese Frage zu geschützten Variablen könnte ebenfalls hilfreich sein.

Öffentlich zugänglich Mitglieder einer Klasse A sind für alle und jeden zugänglich.

Geschützt Member einer Klasse A sind außerhalb des Codes von A nicht zugänglich, aber vom Code jeder von A abgeleiteten Klasse aus zugänglich.

Privat Mitglieder einer Klasse A sind außerhalb des Codes von A oder aus dem Code einer von A abgeleiteten Klasse nicht zugänglich.

Letztendlich beantwortet die Wahl zwischen geschützt oder privat also die folgenden Fragen: Wie viel Vertrauen sind Sie bereit, dem Programmierer der abgeleiteten Klasse zu schenken?

Standardmäßignehmen Sie an, dass der abgeleiteten Klasse nicht vertraut werden soll, und Machen Sie Ihre Mitglieder privat. Wenn Sie einen sehr guten Grund haben, den abgeleiteten Klassen freien Zugriff auf die Interna der Mutterklasse zu gewähren, können Sie sie schützen.

  • Die abgeleitete Klasse sollte ein Typ Ihrer Klasse sein, und die geschützten Daten der Basisklasse sind Teil der Daten der abgeleiteten Klasse. Es wird erwartet, dass der Schreiber der abgeleiteten Klasse diese Daten ordnungsgemäß behandelt, oder es handelt sich um einen Fehler. Private Daten in einer Basisklasse sind jedoch etwas, das der Schreiber der abgeleiteten Klasse nicht kontrolliert.

    – Goldesel

    11. Oktober 2016 um 11:35 Uhr

  • @Goldesel the protected data of the base class is part of the data of the derived class. In der Tat. Ist es dann nicht besser, wenn der Schreiber der abgeleiteten Klasse diese Daten in seiner Klasse deklariert, anstatt in meiner? … 🙂 … The writer of the derived class is expected to handle this data properly or it is a bug. Im NVI-Muster besteht das Ziel darin, alles privat zu machen, einschließlich Methoden, um den Schaden zu begrenzen, den der abgeleitete Klassenschreiber der Hierarchie zufügen könnte. Geschützte Methoden sind bereits ein potenzielles Problem. Ich bin nicht davon überzeugt, dass es der richtige Ansatz ist, dies durch die Verwendung eines geschützten Zustands zu verschlimmern.

    – Paercebal

    11. Oktober 2016 um 21:05 Uhr

  • Es könnte sein, dass Sie virtuelle “Getter” in der Basisklasse haben müssten, um darauf zuzugreifen. Und obwohl Sie Zwischenklassen haben können, um die verschiedenen Arten der Implementierung des Datenmusters durchzuführen, ist dies nicht immer praktikabel. Zum Beispiel ist ein „Muster“, das in Sprachen üblich ist, die keinen „const“-Modifikator haben, obwohl es in C++ meistens nicht notwendig ist, eine schreibgeschützte Basisklasse und beschreibbare abgeleitete Klassen zu haben. In C++ kann dies auch nett sein, einfach weil Sie mehr als eine Möglichkeit zum Laden (Initialisieren) der Daten wünschen.

    – Goldesel

    13. Oktober 2016 um 8:53 Uhr

  • Dazu gibt es verschiedene Möglichkeiten. Machen Sie Ihre Serialisierungsklassen zu Freunden. Legen Sie alle Ihre Daten in eine Struktur mit öffentlichem Zugriff, aber Ihre Klasse hat ein privates Mitglied dieser Variablen …. Geschützte Mitglieder und abgeleitete Klassen, um sie aus einer beliebigen Quelle zu laden, sind manchmal einfacher.

    – Goldesel

    13. Oktober 2016 um 8:55 Uhr

Was ist der Unterschied zwischen privaten und geschutzten Membern von
Roddy

Auf geschützte Member kann von abgeleiteten Klassen aus zugegriffen werden. Private können das nicht.

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
};

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};‌‌

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};

In Bezug auf “Best Practice” kommt es darauf an. Wenn auch nur die leise Möglichkeit besteht, dass jemand eine neue Klasse von Ihrer bestehenden ableiten möchte und Zugriff auf interne Mitglieder benötigt, machen Sie sie geschützt, nicht privat. Wenn sie privat sind, kann es schwierig werden, von Ihrer Klasse zu erben.

  • Ich bin anderer Meinung: Wenn es eine schwache Möglichkeit gibt, dass Nein Unterklasse wird es brauchen, machen Sie es privat. Außer du beabsichtigen Um Ihre Klasse in Unterklassen umzuwandeln, verwenden Sie das Vorlagenmethodenmuster.

    – xtofl

    22. Oktober 2008 um 9:42 Uhr

  • Wenn Sie nicht beabsichtigen, Ihre Klasse in Unterklassen umzuwandeln, machen Sie sie endgültig. Privat vs. geschützt ist nur ein Problem, wenn die Klasse unterklassiert werden soll.

    Benutzer4945014

    31. Juli 2021 um 22:29 Uhr

Der Grund, warum MFC Protected bevorzugt, liegt darin, dass es sich um ein Framework handelt. Wahrscheinlich möchten Sie die MFC-Klassen ableiten, und in diesem Fall wird eine geschützte Schnittstelle benötigt, um auf Methoden zuzugreifen, die für die allgemeine Verwendung der Klasse nicht sichtbar sind.

1646917808 696 Was ist der Unterschied zwischen privaten und geschutzten Membern von
Mats Fredriksson

Es hängt alles davon ab, was Sie tun möchten und was die abgeleiteten Klassen sehen können sollen.

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // will work, simply calls the derived version.
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}

1646917808 184 Was ist der Unterschied zwischen privaten und geschutzten Membern von
fhe

Attribute und Methoden, die als gekennzeichnet sind protected sind — anders als private — noch in Unterklassen sichtbar.

Sofern Sie nicht die Möglichkeit haben möchten, die Methode in möglichen Unterklassen zu überschreiben, würde ich sie erstellen private.

1646917809 361 Was ist der Unterschied zwischen privaten und geschutzten Membern von
Gemeinschaft

Werfen Sie einen Blick auf die Frage zu den geschützten Elementvariablen. Es wird empfohlen, private als Standard zu verwenden (genau wie C++ classses tun), um die Kopplung zu reduzieren. Geschützte Member-Variablen sind meistens eine schlechte Idee, geschützte Member-Funktionen können zB für das Template-Method-Pattern verwendet werden.

  • Komisch, ich habe das in meinem Beitrag bearbeitet, bevor ich deinen gesehen habe. Upvoted, weil Vögel einer Feder über denselben Link stolpern 🙂

    – Firas Assaad

    22. Oktober 2008 um 9:59 Uhr

988040cookie-checkWas ist der Unterschied zwischen privaten und geschützten Membern von C++-Klassen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy