代码之家  ›  专栏  ›  技术社区  ›  SigTerm

嵌套类:从嵌套的受保护类访问封闭类的受保护成员

c++
  •  17
  • SigTerm  · 技术社区  · 16 年前

    class A{
    protected:
        int i;
        class B{
        public:
            A* a;
            B(A* a_)
            :a(a_){
            }
            void doSomething(){
                if (a)
                    a->i = 0;//<---- this part
            }       
        };
    public:
        A()
        :i(0){
        }
    };
    

    如您所见,B可以访问封闭类的“protected”部分,尽管它没有声明为friend。

    这是标准行为吗?

    4 回复  |  直到 16 年前
        1
  •  16
  •   Håvard S    16 年前

    在C++ 03标准中,118P1表示:

    嵌套类的成员对封闭类的成员没有特殊访问权限。

    然而,该决议 defect report 45 (与标准相反)说明相反的情况,从而定义您看到的行为:

    嵌套类是成员,因此具有与任何其他成员相同的访问权限。

    在C++ 0x中,11.8的文本已经被改变以反映这个事实,所以这是C++ 03和C++ 0x一致编译器的有效行为。

    this thread 从 cprogramming.com 论坛。

        2
  •  5
  •   dirkgently    16 年前

    我没有一个C++ 03的拷贝,但是从C++ 0x的草稿(N3090)中可以看到:

    1 嵌套类 是成员,因此具有相同的 封闭类的成员没有 对嵌套 类;通常的访问规则(子句 11) 必须服从。

    [示例:

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

    因此,至少在下一个标准中,封闭类可以像任何普通成员函数一样访问外部类的成员。

    DR 45 )是为了解决这个问题。 (SigTerm的编辑删掉了这个。请小心。)

    -Wall -ansi -pedantic -std=c++98 在C++ C++ 03模式下,科莫(4.3.1.1)禁用了C++ 0x扩展——它们似乎都接受对外部类的访问。 private 内部类成员中的成员。

        3
  •  0
  •   Chubsdad    16 年前

    参考$9.7/1。

    封闭类中的类型名、静态成员和枚举数。“

        4
  •  0
  •   Community Mohan Dere    6 年前

    这是标准行为吗?

    .

    Section 11.8.1

    嵌套类

    嵌套类的成员不能特别访问封闭类的成员,也不能访问授予封闭类友谊的类或函数;应遵守通常的访问规则(第11条)。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第11条)。

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

    ISO/IEC N 3092 上面写着

    嵌套类是成员,因此具有与任何其他成员相同的访问权限 . 封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第11条)。