2012-01-15 11 views
7

Jest to kod:dostęp do prywatnych danych należących klasy zewnętrznej w wewnętrzną klasy

#include <iostream> 

class Outer{ 
    int a; // private data member of class Outer 
public: 
    Outer(): a(55){} 
    class Inner{ 
    public: 
     void fun(Outer ob){ 
      std::cout << ob.a << std::endl; 
     } 
    }; 
}; 

int main() { 

    Outer::Inner object; 
    object.fun(Outer()); // prints 55 
    //std::cout << (Outer().a) << std::endl; error: 'int Outer::a' is private 

    return 0; 
} 

Dlaczego klasa wewnętrzna ma dostęp do prywatnych danych Państwa „a” klasy kosmicznej? Po tym artykule XL C/C++ V8.0 for Linux, nie powinien on się kompilować, jednak kompiluje się na g ++ 4.4.0.

Odpowiedz

4

Zgodnie z tym dokumentem XL C/C++ V8.0 nie obsługuje C++ 11, zobacz sekcję "Zgodność ze standardami językowymi".

Kompilator obsługuje następujące specyfikacje językiem programowania dla C i C++:

  • ISO/IEC 9899: 1999 (C99)
  • ISO/IEC 9899: 1990 (dalej C89)
  • ISO/IEC 14882: 2003 (zwany standard C++)
  • ISO/IEC 14882: 1998, pierwsza oficjalna specyfikacja języka (dalej C++ 98)

Obecny standard mówi (ISO/IEC 14882: 2011 11.7):

klasa zagnieżdżona jest członkiem i jako taki ma takie same prawa dostępu jak każdego innego członka. Członkowie klasy otaczającej nie mają specjalnego dostępu do członków klasy zagnieżdżonej; należy przestrzegać zwykłych zasad dostępu (punkt 11).

W poprzednim języku standardowym, czy też tego dostępu nie było dozwolone, lub co najmniej nie było jasne, czy powinno być dozwolone, w zależności od interpretacji.

+0

Nie, ten artykuł mówi również, że wewnętrzna klasa nie ma dostępu do otaczającej klasy. Ale masz rację, że jest całkowicie poprawny. – hvd

+0

@hvd: Myślę, że masz rację, zredagowano. Musiałem ponownie przeczytać to kilka razy, ponieważ wydaje się nieco pomieszane. –

+0

W rzeczywistości jest to całkowicie poprawne, ale (prawdopodobnie, gdy IBM napisał swoją dokumentację i kompilator) nie było pierwotnie ważne: zostało poprawne na http://www.open-std.org/JTC1/SC22/WG21/docs /cwg_defects.html#45 – hvd

8

C++ 03 Standardowy $ 11,8/1: [class.access.nest]

Członkowie zagnieżdżonej klasy nie mają specjalnego dostępu do członków klasy otaczającej, ani do klas lub funkcji które zapewniły przyjaźń zamkniętej klasie; należy przestrzegać zwykłych zasad dostępu (punkt 11). Członkowie klasy otaczającej nie mają specjalnego dostępu do członków klasy zagnieżdżonej; należy przestrzegać zwykłych zasad dostępu (punkt 11).

Ale to jest wada:

45. Access to nested classes

w C++ 11, zostało to poprawione: w C++ 11 klas zagnieżdżonych mają dostęp do prywatnych członków klasy okalającego (chociaż klasa otaczająca nadal nie ma dostępu do prywatnych członków klas zagnieżdżonych).

C++ 11 Standardowe 11.7 Klasy zagnieżdżone: mówi

klasa zagnieżdżona jest członkiem i jako taki ma takie same prawa dostępu jak każdego innego członka. Członkowie klasy otaczającej nie mają specjalnego dostępu do członków klasy zagnieżdżonej; należy przestrzegać zwykłych zasad dostępu (Rozdział 11) .[

class E { 
    int x; 
    class B { }; 
    class I { 
    B b; // OK:E::I can accessE::B 
    int y; 
    void f(E* p, int i) { 
     p->x = i; // OK:E::I can accessE::x 
    } 
    }; 
    int g(I* p) { 
    return p->y; // error:I::y is private 
    } 
}; 
—end example] 

Przykładem jest podobna do tej, którą mają w pytaniu i to wyraźnie wskazuje na jego poprawną zachowanie.

Powiązane problemy