2012-01-15 1 views
7

Существует этот код:Доступ к личным данным членов внешнего класса во внутреннем классе

#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; 
} 

Почему Внутренний класс имеет доступ к частной информации членов «а» класс Outer? Следуя этой статье XL C/C++ V8.0 for Linux, она не должна компилироваться, однако она компилируется на g ++ 4.4.0.

ответ

4

В соответствии с этим документом XL C/C++ V8.0 не поддерживает C++ 11, см. Раздел «Соответствие стандартам языка».

Компилятор поддерживает следующие спецификации языка программирования для C и C++:

  • ИСО/МЭК 9899: 1999 (С99)
  • ИСО/МЭК 9899: 1990 (упоминается как C89)
  • ISO/IEC 14882: 2003 (называемый Standard C++)
  • ISO/IEC 14882: 1998, первая официальная спецификация языка (упоминается как C++ 98)

Текущий стандарт говорит (ISO/IEC 14882: 2011 11.7):

Вложенный класс является членом и, таким образом, имеет те же права доступа, как и любой другой член. Члены закрывающего класса не имеют специального доступа к членам вложенного класса; должны соблюдаться обычные правила доступа (пункт 11).

В предыдущем языковом стандарте был ли этот доступ запрещен или, по крайней мере, было неясно, должно ли оно разрешаться, в зависимости от вашей интерпретации.

+0

Нет, в этой статье также говорится, что внутренний класс не имеет доступа к охватывающему классу. Но вы правы, что это совершенно верно. – hvd

+0

@hvd: Я думаю, ты прав, отредактирован. Мне пришлось перечитать его несколько раз, потому что это кажется немного запутанным. –

+0

На самом деле, это совершенно справедливо, но (предположительно, когда IBM написала свою документацию и компилятор) изначально недействительно: он был действителен по адресу http://www.open-std.org/JTC1/SC22/WG21/docs /cwg_defects.html#45 – hvd

8

C++ 03 Стандартный $ 11,8/1: [class.access.nest]

Члены вложенного класса не имеют специального доступа к членам класса объемлющей, ни классов или функций которые предоставили дружбу закрытому классу; должны соблюдаться обычные правила доступа (пункт 11). Члены закрывающего класса не имеют специального доступа к членам вложенного класса; должны соблюдаться обычные правила доступа (пункт 11).

Но это дефект:

45. Access to nested classes

В C++ 11, это было исправлено: в 11 вложенных классов C++ имеют доступ к закрытым членам объемлющего класса (хотя закрывающий класс по-прежнему не имеет доступа к закрытым членам вложенных классов).

C++ 11 Стандарт 11.7 Вложенные классы: говорит

Вложенный класс является членом и, таким образом, имеет те же права доступа, как и любой другой член. Члены закрывающего класса не имеют специального доступа к членам вложенного класса; должны соблюдаться обычные правила доступа (пункт 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] 

пример похож на тот, который вы имеете в вопросе, и это ясно показывает свое действительное поведение.

 Смежные вопросы

  • Нет связанных вопросов^_^