2013-08-19 7 views
3

제목이 약간 오도 할 수도 있습니다. 나는 다음과 같은 문제가있다 : 나뭇잎과 내부 노드로 구성된 나무가있다. 사용자는 나뭇잎에 모든 정보를 저장할 수 있어야합니다. 트리는 사용자 정의 값 집합을 가지며 상수 시간 (상각되지 않음)으로 해당 잎에 액세스해야하는 몇 가지 메소드가 있습니다.C++ 중첩 클래스의 개인 멤버에 액세스

나는 다음과 같은 아이디어를 내놓았다하지만 불행히도 내가 중첩 된 클래스의 private 멤버에 액세스 할 수 있기 때문에 작동하지 않습니다 : 사용자는 트리 각 리프도에 대한 user_defined 값을 포함 UserElement의 인스턴스 생성 해당 잎. doSomethingWithTheTree (list>)와 같은 메소드가 호출되고 트리가 작성되면 해당 트리가 해당 트리를 만들고 개인 필드 leaf에 저장됩니다. 사용자가 user_defined 값에 해당하는 일부 잎을 가진 메소드를 호출하기를 원할 때마다, 사용자는 대응하는 UserElement을 제공함으로써 메소드를 호출하기 만하면 트리는 상수 시간에 해당 잎을 검색 할 수 있습니다.

class Tree { 
    public: 
     template <typename T> 
     class UserElement { 
      private: 
       T user_value; 
       tree_node* leaf; // this has to be private for 
           // everyone outside the class `Tree` 
      public: 
       T getInf() { 
        return user_value; 
       } 
       void setInf(T i) { 
        user_value = i; 
       } 
     }; 

     void doSomethingWithTheTree(list<UserElement<T>> elements) { 
      ... 
      // I want to be able to access elem.leaf for all elements 
     } 
} 
+1

하위 클래스가 아닌 중첩 된 클래스입니다. 용어에주의하십시오. 질문의 의미가 많이 바뀝니다. – Manu343726

답변

8

기술적으로, 즉 (다른 클래스 내에서 선언)을 중첩 클래스 (슈퍼 클래스에서 상속)가 아닌 서브 클래스입니다.

당신은 Tree 클래스 그것을 친구함으로써 자사의 음부에 액세스 할 수 있도록 할 수 있습니다 더 나은 캡슐화

class UserElement { 
    friend class Tree; 
    // ... 
}; 

또는, 당신은 있지만, 단지 그것을 필요로하는 멤버 함수 (들)에 대한 액세스를 제한 할 수 올바른 순서로 선언 할 필요가 있기 때문에 다소 지저분 해집니다.

class Tree { 
public: 
    // Declare this so we can declare the function 
    template <typename T> class UserElement; 

    // Declare this before defining `UserElement` so we can use it 
    // in the friend declaration 
    template <typename T> 
    void doSomethingWithTheTree(list<UserElement<T>> elements) { 
     elements.front().leaf; 
    } 

    template <typename T> 
    class UserElement { 
     // Finally, we can declare it a friend. 
     friend void Tree::doSomethingWithTheTree<T>(list<UserElement<T>>); 
     // ... 
    }; 
}; 
+0

힌트를 보내 주셔서 감사합니다. 나는 그저 제목을 바꾸고 싶었지만 다른 누군가는 더 빨랐다.) – user1305497

1

당신은

class Outer { 
    private: // maybe protected: 
    class Inner { 
     public: 
     .... 
    }; 
}; 

또는

class Outer { 
    public: 
    class Inner { 
     friend class Outer; 
     private: 
     .... 
    }; 
}; 
+1

빠른 답변 감사드립니다. 첫 번째 해결책은 나를 위해 작동하지 않습니다. 왜냐하면'nner '는'Outer' 외부에서 호출되어야하기 때문입니다. 그러나 두 번째 솔루션은 정상적으로 작동합니다. 나는 C++에'friend'와 같은 것이 있다는 것을 몰랐습니다. :) – user1305497

1

당신은 TreeUserElement<>모든 멤버에 액세스 할 수 있도록 것이다, UserElement<>class Treefriend을 선언 할 수 있습니다 할 수 있습니다.

관련 문제