Programing

C ++의 내부 클래스는 자동으로 친구입니까?

lottogame 2020. 11. 8. 09:10
반응형

C ++의 내부 클래스는 자동으로 친구입니까?


C ++에서 내부 클래스를 정의하면 자동으로 해당 클래스를 포함하는 클래스의 친구입니까? 예를 들어 다음은 합법적입니까?

class Outer {
public:
    class Inner {
    public:
        void mutateOuter(Outer& o);
    };

private:
    int value;
};

void Outer::Inner::mutateOuter(Outer& o) {
    o.value ++; // Legal?  Or not?
}

내가 시도한 일부 컴파일러 (VS2003)에서는이 코드가 작동하지 않기 때문에 묻지 만, 적어도 일부 컴파일러에서는 작동한다는 이야기를 들었습니다. 나는 이것에 대한 C ++ 사양에서 관련 섹션을 찾을 수 없으며 누군가가 합법적이거나 합법적이지 않다고 말하는 특정 내용을 인용 할 수 있다면 좋을 것입니다.


여기 에서 동일한 질문을 다소간 물어 본 후 C ++ 11에 대한 (분명히) 업데이트 된 답변을 공유하고 싶었습니다.

https://stackoverflow.com/a/14759027/1984137 에서 인용 :

표준 $ 11.7.1

"중첩 된 클래스는 구성원이며 다른 구성원과 동일한 액세스 권한을 갖습니다. 둘러싸는 클래스의 구성원은 중첩 된 클래스의 구성원에 대한 특별한 액세스 권한이 없습니다. 일반적인 액세스 규칙을 준수해야합니다."

일반적인 액세스 규칙은 다음을 지정합니다.

"클래스의 멤버는 클래스가 액세스 할 수있는 모든 이름에 액세스 할 수도 있습니다 ..."

특정 예가 표준에 나와 있습니다.

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

C ++ 11까지 (예 : C ++ 98 및 C ++ 03)

C ++ 98 및 C ++ 03에서 중첩 된 클래스 기본적으로 포함하는 클래스의 멤버 private액세스 할 수 없습니다protected .

C ++ Standard (2003)는 $ 11.8 / 1 [class.access.nest]에서 말합니다.

중첩 클래스의 멤버는 둘러싸는 클래스의 멤버 나 둘러싸는 클래스에 우정을 부여한 클래스 나 함수 에 대한 특별한 액세스 권한이 없습니다 . 일반적인 액세스 규칙 (11 절)을 준수해야합니다. 둘러싸는 클래스의 멤버는 중첩 클래스의 멤버에 대한 특별한 액세스 권한이 없습니다. 일반적인 액세스 규칙 (11 절)을 준수해야합니다.

표준 자체의 예 :

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

C ++ 11 이후

위의 제한은 C ++ 11 이후 제거되었습니다. 이제 중첩 된 클래스 둘러싸는 클래스 privateprotected멤버에 액세스 할 수 있습니다 .

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

도움이되기를 바랍니다.


질문자가 답 중 하나를 받아 들인 것 같기 때문에 이것은 단지 보충 일뿐입니다.
표준은 접근성에 대한 사양을 변경 한 것 같습니다.

§11.8/1 in C++98 states:

The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friendship to an enclosing class; the usual access rules shall be obeyed.

§11.8/1 in N1804(after TR1) states:

A nested class is a member and as such has the same access rights as any other member.

I think current C++ compilers obey newer specification.


This answer pertains to the (outdated) C++03 specification. The accepted answer at this question is more up to date.

Well, I feel silly for asking this question now because I just found the relevant part of the spec that covers this: §11.8/1:

The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friendship to an enclosing class; the usual access rules (clause 11) shall be obeyed. The members of an enclosing class have no special access to members of a nested class; the usual access rules (clause 11) shall be obeyed

(My emphasis)

So it looks like no, inner classes do not have special access privileges.


I don't the precise location off the top of my head, but I do recall reading through the specs and finding that any private data in a class is hidden from all other classes, including nested classes.

Basically, nesting a class defines a certain scope, not access priviledges.

참고URL : https://stackoverflow.com/questions/5013717/are-inner-classes-in-c-automatically-friends

반응형