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 이후 제거되었습니다. 이제 중첩 된 클래스 는 둘러싸는 클래스 의 private
및 protected
멤버에 액세스 할 수 있습니다 .
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
'Programing' 카테고리의 다른 글
HTML5는 폴더 또는 폴더 트리의 드래그 드롭 업로드를 허용합니까? (0) | 2020.11.08 |
---|---|
중괄호가 있거나없는 C # Switch 문… 차이점은 무엇입니까? (0) | 2020.11.08 |
내 서버의 ECDSA 키 지문이 무엇인지 확인하려면 어떤 명령을 사용해야합니까? (0) | 2020.11.08 |
목록의 특정 색인에 요소를 삽입하고 업데이트 된 목록을 반환합니다. (0) | 2020.11.08 |
Bash에서 동시에 두 배열을 반복합니다. (0) | 2020.11.08 |