2016-03-15 6 views
9

Hallo Ich frage mich, warum C++ - Standard uns in geschachtelten Klassen erlaubt, auf private Felder der äußeren Klasse zuzugreifen, während es verbietet, auf private Felder der inneren Klasse von der äußeren Klasse zuzugreifen. Ich verstehe, dass dieses Beispiel:C++ Äußerer Klassenzugriff Innere Klasse ist privat - Warum verboten?

class OuterClass{ 
public: 
    class InnerClass{ 
    public: 
     void printOuterClass(OuterClass& outer) {cout << outer.m_dataToDisplay;}; 
    }; 
private: 
    int m_dataToDisplay; 
}; 

ist in Ordnung, weil Ding, dass innere Klasse manchmal kompliziert sein kann. Aber ich denke, Szenario finden Sie auch in Ordnung:

class Algorithm{ 
public: 
    class AlgorithmResults{ 
    public: 
     void readAlgorithmResult(); 
    private: 
     void writeAlgorithmResult(); 
    }; 

    void calculate(AlgorithmResults& results, Arguments...){ 
     //calculate stuff 
     results.writeAlgorithmResult(results); 
    } 
}; 

Für mich ist diese Struktur durchaus Sinn macht, obwohl es nicht in C++ erlaubt ist. Mir ist auch aufgefallen, dass für einige Zeit beide in Java erlaubt waren, aber jetzt ist auch ein zweites Beispiel verboten. Was ist der Grund, dass das erste Beispiel erlaubt ist und ein anderes verweigert wird?

Antwort

15

Im Wesentlichen Code innerhalb ein Bereich hat Zugriff auf die Dinge in diesem Bereich deklariert (sofern sie nicht beschattet sind). Code außerhalb ein Bereich hat keinen Zugriff auf Dinge innerhalb des Bereichs. Z.B. Code nach einem geschweiften Klammernblock hat keinen Zugriff auf Variablen, die in diesem Block deklariert sind.


Für das zweite Beispiel, machen nur Algorithm ein friend von AlgorithmResults:

class AlgorithmResults 
{ 
    friend class Algorithm; 
+5

Sorry, ich invertierte die Freundschaft und musste reparieren. Dies ist ein weiterer Beweis dafür, dass Kaffee benötigt wird, bevor er auf SO! –

4

Die verschachtelte Klassen äußeren Klasse private Felder zugreifen konnte, weil es sich um ein Mitglied der äußeren Klasse ist, genau gleich wie die andere Mitglieder.

von 11,7/1 Verschachtelte Klassen [class.access.nest]

Eine verschachtelte Klasse ist Mitglied und hat als solche die gleichen Zugriffsrechte wie jedes andere Mitglied.

Auf der anderen Seite hat die äußere Klasse keine speziellen Zugriffsrechte auf die geschachtelte Klasse, sie sind nur normale Beziehung.

Die Mitglieder des eine umschließenden Klasse haben keinen besonderen Zugriff auf Mitglieder einer verschachtelten Klasse; die üblichen Zugangsregeln (Abschnitt 11) sind einzuhalten.

+0

Dies wiederholt nur die Fakten, aber das OP will die Fakten gerechtfertigt (obwohl ich denke, das ist keine besonders gute Frage). –

+0

@BarryTheHatchet Ich habe versucht, es von den verschiedenen Ansichten der inneren Klasse zur äußeren Klasse und von der Klasse zur inneren Klasse zu erklären. Unklar? – songyuanyao

+0

Sie haben die Regeln sehr gut erklärt.Ich denke nur nicht, dass es das ist, wonach das OP gefragt hat. –

5

Gegenfrage: Warum möchten Sie es zulassen?

Wenn Sie eine äußere Klasse benötigen Zugang zu einer inneren Klasse privaten Interna, können Sie befreunden:

class Foo { 
    public: 
      class Frob { 
        friend class Foo; 
        int privateDataMember; 
      }; 

      Foo() { 
        Frob frob; 
        frob.privateDataMember = 3735928559; 
      } 
    }; 

C++ hat kein Gerät unfriend, so Standard privaten Zugang zu einem äußeren Klasse ermöglicht würden Sie stehlen ein Klassenentwurfstool und eine reduzierte Standardkapselung.