2009-10-22 4 views
7

중첩 클래스를 구현하는 데 문제가 있습니다. 누가 생성자를 둘러싸는 클래스의 개인 데이터 멤버 중 일부와 함께 초기화됩니다.중첩 클래스의 '액세스하는 클래스에 대한 액세스'개인 데이터 멤버

예 :

Header File: 
class Enclosing { 
    //...Public members 
    //...Private members 
    int x, int y 
    class Inner; // Declaration for nested class 
}; 

Impl. File: 
// Stuff... 
class Enclosing::Inner { 
    explicit Inner() : foo(x), bar(y) // foo and bar are data members of Inner 
    //... 
}; 

나는 invalid use of non-static data member 오류가 발생합니다. 내포 된 클래스의 멤버에 대한 중첩 클래스 액세스에 관해서 내가 놓치고있는 것이 있습니까?

답변

18

회원 xyEnclosing의 비 정적 데이터 멤버,있는 즉, 그들은 Enclosing 클래스의 구체적인 객체 내에 만 존재합니다. 구체적인 물체가 없으면 x이나 y도 존재하지 않습니다. 한편, 객체가없는 xy을 참조하려고합니다. 그건 컴파일러가 당신에게 말하려고하는 것입니다. 당신이 xy에서 회원 Inner::fooInner::bar를 초기화하려면

, 당신은 Inner의 생성자에 Enclosing 유형의 구체적인 개체를 전달해야합니다. 예를 들어,

class Enclosing::Inner {  
    explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y) 
    {} 
    //... 
}; 

추가 참고 사항 : 원래 C++ 98에서는 내부 클래스가 외부 클래스에 액세스하는 특별한 권한이 없습니다. C++ 98 컴파일러를 사용하면 내부 클래스에 필요한 권한 (우정)을 부여하거나 xy 멤버를 공개해야합니다. 그러나이 상황은 C++ 98에서 defect으로 분류되었으며 내부 클래스는 외부 클래스 멤버 (개인 클래스도 포함)에 대한 모든 액세스 권한을 가져야한다고 결정되었습니다. 따라서 액세스 권한과 관련하여 추가 작업을해야하는지 여부는 컴파일러에 따라 다릅니다.

+1

감사합니다. 나는 C++ 98의 결함을 독자적으로 연구하면서 읽었으며, 무엇을 만들지 확신하지 못했습니다. 모든 것을 정리해 주셔서 감사합니다. – trikker

8

코드의 문제는 AndreyT에 의해 지적, not visibility이지만, Inner 클래스의 인스턴스는 Enclosing 클래스의 구체적인 인스턴스에 바인딩되지 않았는지 확인합니다. 즉, 컴파일러가 Inner을 생성 할 때 xy 값을 가져올 개체를 알 수있는 방법이 없습니다.

명시 적으로 그렇게 Inner 클래스의 생성자에 Enclosing 클래스의 인스턴스를 제공해야합니다 :

class Enclosing 
{ 
private: 
    int x; 
    int y; 

    class Inner 
    { 
    private: 
    int foo; 
    int bar; 

    public: 
    explicit Inner(const Enclosing& e) 
     : foo(e.x), bar(e.y) 
    { } 
    }; 
}; 
0

우리가 둘러싸는 클래스의 쥐똥 나무 속의 식물 멤버에 액세스하려고하면 class.compiler이 오류를 보여 둘러싸의 쥐똥 나무 속의 식물 데이터 멤버에 액세스 할 수 없습니다 중첩 된 클래스는 단지 .....

둘러싸는 클래스의 공용 데이터 멤버에 액세스 할 수 있습니다
관련 문제