it-swarm.com.de

Private und geschützte Mitglieder: C++

Kann mich jemand über den Unterschied zwischen private und protected Mitgliedern in Klassen aufklären?

Ich verstehe aus Best-Practice-Konventionen, dass Variablen und Funktionen, die nicht außerhalb der Klasse aufgerufen werden, private gemacht werden sollten - aber in meinem MFC -Projekt scheint MFCprotected zu bevorzugen.

Was ist der Unterschied und welchen sollte ich verwenden?

236
Konrad

Private Mitglieder sind nur innerhalb der Klasse, in der sie definiert sind, zugänglich.

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

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

Edit 2: Verwenden Sie, was im Zusammenhang mit Ihrem Problem sinnvoll ist. Sie sollten versuchen, Mitglieder privat zu machen, wenn Sie können, um die Kopplung zu reduzieren und die Implementierung der Basisklasse zu schützen. Wenn dies nicht möglich ist, verwenden Sie geschützte Mitglieder. Überprüfen Sie C++ FAQ , um das Problem besser zu verstehen. Diese Frage zu geschützten Variablen könnte auch helfen.

326
Firas Assaad

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

Geschützt Mitglieder einer Klasse A sind nicht außerhalb des Codes von A zugänglich, aber sie sind über den Code einer von A abgeleiteten Klasse zugänglich.

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

Am Ende beantwortet die Wahl zwischen geschützt oder privat die folgenden Fragen: Wie viel Vertrauen willst du dem Programmierer der abgeleiteten Klasse entgegenbringen?

Standardmäßig gehe davon aus, dass die abgeleitete Klasse nicht vertrauenswürdig ist, und mache deine Mitglieder privat . Wenn Sie einen sehr guten Grund haben, den internen Klassen der Mutterklasse freien Zugriff auf die abgeleiteten Klassen zu gewähren, können Sie sie schützen.

119
paercebal

Auf geschützte Mitglieder kann von abgeleiteten Klassen aus zugegriffen werden. Private können 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 die Möglichkeit besteht, dass jemand eine neue Klasse von Ihrer vorhandenen Klasse ableiten möchte und Zugriff auf interne Mitglieder haben möchte, müssen Sie diese als geschützt und nicht als privat kennzeichnen. Wenn sie privat sind, kann es schwierig werden, Ihre Klasse zu erben.

55
Roddy

Der Grund, dass MFC geschützt ist, liegt daran, dass es sich um ein Framework handelt. Möglicherweise möchten Sie die MFC-Klassen subklassieren. In diesem Fall ist eine geschützte Schnittstelle erforderlich, um auf Methoden zuzugreifen, die für die allgemeine Verwendung der Klasse nicht sichtbar sind.

21
Toon Krijthe

Es hängt alles davon ab, was Sie tun möchten und was die abgeleiteten Klassen sehen 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(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}
8

Attribute und Methoden, die als protected markiert sind, sind - im Gegensatz zu privaten - in Unterklassen noch sichtbar.

Wenn Sie die Methode in möglichen Unterklassen nicht überschreiben oder verwenden möchten, würde ich sie als private definieren.

5
fhe

Schauen Sie sich die Geschützte Elementvariablen Frage an. Es wird empfohlen, privat als Standard zu verwenden (genau wie bei C++ classses), um die Kopplung zu reduzieren. Geschützte Elementvariablen sind meistens eine schlechte Idee, geschützte Elementfunktionen können z. das Muster der Vorlagenmethode. 

4
xtofl

Auf geschützte Member kann nur von Nachkommen der Klasse und durch Code im selben Modul zugegriffen werden. Auf private Mitglieder kann nur durch die Klasse, in der sie deklariert sind, und durch Code in demselben Modul zugegriffen werden.

Freundliche Funktionen werfen dies natürlich aus dem Fenster, aber na ja.

private Mitglieder sind nur innerhalb der Klasse zugänglich, geschützte Mitglieder sind in der Klasse und den abgeleiteten Klassen zugänglich. Es ist eine Eigenschaft der Vererbung in OO Sprachen.

Sie können in C++ über eine private, geschützte und öffentliche Vererbung verfügen, mit der festgelegt wird, auf welche abgeleiteten Klassen in der Vererbungshierarchie zugegriffen werden kann. C # hat beispielsweise nur öffentliche Vererbung.

4
PhilGriffin

private = nur für das Mutterschiff (Basisklasse) zugänglich (dh nur meine Eltern können in das Schlafzimmer meiner Eltern gehen)

protected = erreichbar durch Mutterschiff (Basisklasse) und ihre Töchter .__ (dh nur meine Eltern können in das Schlafzimmer meiner Eltern gehen, haben aber ihrem Sohn/ihrer Tochter die Erlaubnis erteilt, in das Schlafzimmer der Eltern zu gehen)

public = zugänglich durch Mutterschiff (Basisklasse), Tochter und alle anderen. (dh nur meine Eltern können in das Schlafzimmer meiner Eltern gehen, aber es ist eine Hausparty - mi casa su casa)

3
Johan K. Rhodes

Da zum Abrufen und Aktualisieren geschützter Member in der abgeleiteten Klasse keine öffentliche Memberfunktion erforderlich ist, wird die Codeeffizienz erhöht und die Menge an Code, den wir schreiben müssen, reduziert. Der Programmierer der abgeleiteten Klasse soll sich jedoch dessen bewusst sein, was er tut.

2
null

private wird für Mitgliedsdaten bevorzugt. Mitglieder in C++ - Klassen sind standardmäßig private

public wird für Elementfunktionen bevorzugt, obwohl dies eine Ansichtssache ist. Zumindest einige Methoden müssen zugänglich sein. public ist für alle zugänglich. Es ist die flexibelste Option und am wenigsten sicher. Jeder kann sie benutzen und jeder kann sie missbrauchen.

private ist überhaupt nicht zugänglich. Niemand kann sie außerhalb der Klasse verwenden und niemand kann sie missbrauchen. Nicht einmal in abgeleiteten Klassen.

protected ist ein Kompromiss, da es in abgeleiteten Klassen verwendet werden kann. Wenn Sie von einer Klasse ableiten, verstehen Sie die Basisklasse gut und achten darauf, diese Mitglieder nicht zu missbrauchen.

MFC ist ein C++ - Wrapper für Windows-API, er bevorzugt public und protected. Vom Visual Studio-Assistenten generierte Klassen weisen eine unschöne Mischung aus protected, public und private-Mitgliedern auf. MFC-Klassen selbst haben jedoch eine gewisse Logik.

Mitglieder wie SetWindowText sind public, da Sie häufig auf diese Mitglieder zugreifen müssen.

Mitglieder wie OnLButtonDown behandeln Benachrichtigungen, die vom Fenster empfangen werden. Auf sie sollte nicht zugegriffen werden, daher sind sie protected. Sie können immer noch in der abgeleiteten Klasse darauf zugreifen, um diese Funktionen zu überschreiben.

Einige Mitglieder müssen Threads und Nachrichtenschleifen ausführen. Auf sie sollte nicht zugegriffen werden oder sie überschreiben. Daher werden sie als private deklariert.

In C++ - Strukturen sind Mitglieder standardmäßig public. Strukturen werden normalerweise nur für Daten verwendet, nicht für Methoden. Daher gilt die public-Deklaration als sicher.

1
  • Private : Es ist ein Zugriffsbezeichner. Standardmäßig sind die Instanzvariablen (Membervariablen) oder die Methoden einer Klasse in c ++/Java privat. Während der Vererbung werden der Code und die Daten immer vererbt, sind aber außerhalb der Klasse nicht zugänglich. Wir können unsere Datenmitglieder als privat deklarieren, sodass niemand direkte Änderungen an unseren Mitgliedsvariablen vornehmen kann, und wir können öffentliche Getter und Setter bereitstellen, um unsere privaten Mitglieder zu ändern. Und dieses Konzept wird immer in der Geschäftsregel angewendet.

  • Geschützt : Es ist auch ein Zugriffsbezeichner. In C++ sind die geschützten Member innerhalb der Klasse und der geerbten Klasse, jedoch nicht außerhalb der Klasse, zugänglich. In Java sind die geschützten Member innerhalb der Klasse, der geerbten Klasse sowie allen Klassen innerhalb desselben Pakets zugänglich.

1
Tutu Kumari

Auf private Member kann nur in derselben Klasse zugegriffen werden, in der angegeben wurde, wo als geschütztes Member in der Klasse zugegriffen werden kann, in der es zusammen mit den von ihm geerbten Klassen deklariert wird.

1
Gayki

Mitglieder und Freunde aller von dieser Basisklasse abgeleiteten Klassen können auf ein geschütztes nicht statisches Basisklassenmitglied zugreifen, indem Sie eine der folgenden Optionen verwenden:

  • Ein Zeiger auf eine direkt oder indirekt abgeleitete Klasse
  • Ein Verweis auf eine direkt oder indirekt abgeleitete Klasse
  • Ein Objekt einer direkt oder indirekt abgeleiteten Klasse
0
mujtaba

Private: Zugriff durch Klassen-Member-Funktionen, Friend-Funktion oder Friend-Klasse ..__ Für C++ - Klasse ist dies der Standardzugriffsspezifizierer.

Protected: Zugriff durch Klassenmitgliederfunktionen, Friend-Funktionen oder Friend-Klassen und abgeleitete Klassen.

  • Sie können Klassenmitgliedervariablen oder -funktionen (auch Typedefs oder innere Klassen) als privat oder geschützt gemäß Ihrer Anforderung beibehalten.
  • Meistens behalten Sie den Klassenmitglied als privat und fügen Funktionen zum Einkapseln hinzu. Dies hilft bei der Pflege von Code.
  • Im Allgemeinen wird die private Funktion verwendet, wenn Sie Ihre öffentlichen Funktionen modular halten möchten oder wiederholten Code eliminieren möchten, anstatt den gesamten Code in eine einzelne Funktion zu schreiben. Dies hilft bei der Pflege von Code.

Siehe diesen Link für mehr Details.

0
Darshan Rajgor