연결된 목록 유형 클래스에 대해 다음 샘플 코드를 고려하십시오. 반복자를 반환하는 메서드를 선언하고 싶습니다.이 메서드는 Node*
에 대해 typedef
입니다. 그러나 Node
은 개인 중첩 클래스이므로 typdef
을 만들기 위해 컴파일러에서 forward 선언을 사용하여 Node
을 알게해야합니다.typedef 및 전달 선언에 대한 액세스 지정자의 역할
Naively, 나는 개인적으로 기본값으로 설정하는 것이 효과가 있다고 생각했습니다. 이 같은 : 라인 4에서 컴파일 타임 오류가 발생
class List
{
class Node;
typedef Node* Iterator;
public:
List() : head_(NULL), tail_(NULL) {}
Iterator begin() {return head_;}
private:
class Node
{
private:
int data_;
};
Node* head_;
Node* tail_;
};
int main()
{
List list;
List::Iterator = list.begin();
return 0;
}
는 :
'형식 정의 클래스 목록 :: 노드 * 목록 :: 반복자는'로 인해 종료
컴파일은 비공개입니다 - 치명적 오류.
이 전방 선언 class Node;
가 typedef Iterator Node*;
에 대한 민간 부분에 속하지만 어떤 이유를 difficut하지? 이것은 아마도 typedef
키워드에 대한 이해가 부족하기 때문에 발생하지만, 어떤 액세스 지정자가 적용되는 것이 중요합니까? 나는 Node
클래스의 가시성 때문에 private
이 더 의미가 있다고 생각했습니다.
공용 인터페이스의 일부인 typedef
과 관련이 있습니까? 모든 typedef는 public
가시성으로 선언해야합니까?
편집 : 나는 대중에게 형식 정의를 이동하여 불평에서 내 컴파일러를 중지 할 수 날 명확히 허용을 이해합니다. 왜 이것이 필요한지 이해할 수 없습니다.
클래스 정의 끝에 세미콜론을 추가하면 오류가 발생하지 않습니다. 이게 진짜 코드인가요? –
아, 그래서 .. 그냥 단순화 된 버전입니다. – StickyCube
@StickyCube 오류를 다시 생성 할 수 있는지 알 수 있습니다. 어쩌면 친구가 아닌 클래스/함수에서'Iterator' 유형을 사용하려고했을 것입니까? –