2010-04-22 6 views
16

HI,내부 클래스

C++ 클래스에서 내측

,

class A { 
    public: 
     void f1(); 
    private: 
     void f2(); 
    class B { 
     private void f3(); 
    }; 

} 

내부 클래스 (B)의 상위 클래스 (A)에 대한 포인터를 가지고 있는가? (자바 에서처럼). B는 부모 클래스를 public/private 메소드 (Java에서와 같이)를 호출 할 수 있습니다.

감사합니다.

답변

28

아니요 - C++에서 중첩 클래스는 클래스 자체의 의미가 아닌 이름과 가시성에만 영향을줍니다. 생성 된 코드가 간다면, 중첩 된 클래스는 중첩되지 않은 클래스와 다르지 않습니다.

변경된 사항은 가시성과 이름입니다 (예 : 외부 클래스의 private: 섹션에있는 경우 외부 세계에 표시되지 않으며 public: 섹션에있는 경우 표시되지만 표시 될 수 있음) 그것의 이름은 outer_class::inner_class입니다. 여전히 완전히 별개의 클래스입니다. 예를 들어 외부 클래스의 인스턴스를 만들지 않고 내부 클래스의 인스턴스를 만들 수 있습니다.

편집 : 죄송합니다. 당신의 질문입니다 .C++ 0x에서 내부 클래스는 외부 클래스의 개인 부분에 액세스 할 수 있습니다. 본질적으로 외부 클래스가 내부 클래스를 친구로 선언했기 때문에 개인 이름을 볼 수 있지만 여전히 뭔가를 전달해야합니다. 외부 클래스의 비 정적 멤버 함수를 호출하기 전에 외부 클래스의 객체에 대한 참조와 비슷합니다.

아직까지는 아니지만 대부분의 컴파일러가이 특정 부분을 이미 구현했다고 생각합니다. 제
는 부모 private 멤버에 액세스 할 수 있습니까 :

+4

그것은이 C++ 0X에 변화가 나타납니다에 액세스 할 수 있습니다. C++ 03은 "중첩 된 클래스의 멤버는 클래스를 묶는 멤버에게 특별한 액세스 권한이 없습니다." C++ 0x FCD는 "중첩 클래스는 멤버이므로 다른 멤버와 동일한 액세스 권한을가집니다." (§11.8/1). (변경 사항은 CWG 결함 45 및 494에서 소개되었습니다. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 및 http://www.open-std.org/ jtc1/sc22/wg21/docs/cwg_defects.html # 494) –

+0

좋음 - 일부 컴파일러에서 지원하는'친구 클래스 {'를 작성 하겠지만, 분명히 중첩 된 클래스를 전혀 멤버로 만들지 않습니다! – Potatoswatter

+1

@Potato : 흥미롭게도 C++ 03 모드는 C++ 03 언어를 따르지 않습니다. 이것은 (a) 어떤 이유로 든 C++ 03 언어를 따르는 것이 불가능할 것 같지만 (위에 링크 된 DR에 언급 된 것 이외에 정확히 왜 그 이유가 무엇인지 아직 알지 못했지만) b) 실제로 아무도 C++ 03 언어를 따르지 않을 가능성이 있습니다 :-). –

7

아니요, 명시 적으로 추가하지 않는 한 클래스 B에는 클래스 A에 대한 포인터가 없습니다.

0

그것은 부모에 대한 포인터를 가지고 있는가

의 정렬 내가 될 수는 액세스 할 수있는 경우에 잘 표준에 정의되지 않은 생각 잘못된.
하지만 당신은 g ++

#include <iostream> 

class X 
{ 
    class Y 
    { 
     public: 
      Y(X* p) 
       :parent(p) 
      {} 
      void TryY() 
      { 
       // Access a private member of X 
       ++(parent->value); 
      } 

     private: 
      X* parent; 
    }; 

    public: 
     X() 
      :y(this) 
     { 
      value = 4; 
     } 

     void TryY() 
     { 
      y.TryY(); 
      std::cout << value << std::endl; 
     } 
    private: 
     Y y; 
     int value; 

}; 

int main() 
{ 
    X x; 
    x.TryY(); 
} 
+0

* §11.8/1 *에 따라 C++ 03에서 올바르지 않은 동작을 나타내야합니다. –