2016-01-23 16 views
8

ich den folgenden Code habe:C++: öffentliches Mitglied eines privaten geschachtelte Klasse Typ

class Base 
{ 
    private: 
    class NestedBase 
    { 
     public: 
     void Do() {} 
    }; 

    public: 
    NestedBase nested; 
}; 

int main() 
{ 
    Base b; 
    b.nested.Do(); // line A compiles 
    Base::NestedBase instance; // line B doesn't compile 
} 

NestedBase Klasse ist eine private geschachtelte Klasse von Base, so ist es natürlich, dass Linie scheint B nicht kompiliert. Andererseits hat Variable b das öffentliche Element nested, und ich kann ihre Methode Do() von außerhalb von Base (wie in Zeile A) aufrufen. Welche genauen Regeln regeln den Zugriff auf die private geschachtelte Klasse (oder ihre Mitglieder) in einem solchen Fall? Was sagt der Standard dazu?

Antwort

6

Nach der Norm, $11.7/1 Nested classes [class.access.nest]:

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

Also, es ist ziemlich einfach. NestedBase ist ein private Mitglied der Klasse Base, so dass Base::NestedBase nicht in main() zugegriffen werden kann.

b.nested.Do(); ist in Ordnung, weil nested und Do() beide public Mitglieder sind. Die Tatsache, dass NestedBase eine private verschachtelte Klasse von Base ist, spielt keine Rolle, es ist hier irrelevant.

2

Der Typname NestedBase ist ein privates Mitglied der Klasse.

class Base 
{ 
private: 
    class NestedBase 
    { 
    public: 
     void Do() {} 
    }; 
    //... 

Sie können also nicht explizit außerhalb der Klasse, wo der Name deklariert ist, darauf zugreifen.

Aber Sie den Namen implizit :)

die folgende Art und Weise zugreifen können
decltype(Base::nested) instance; 
+0

Ich denke, 'Basis :: nested' von' Base' _public_ Mitglied werden müssen. @Vlad, meinst du das? – dyomas