2013-08-25 3 views
2

C++에서 원 목록을 작성하고 있습니다. 여기에 내 코드목록의 색인을 반환하는 좀 더 우아한 방법

class CList 
{ 
private: 
    class ListNode 
    { 
    public: 
     int v; 
     ListNode *prev; 
     ListNode *next; 
     /*constructor*/ 
    }; 
    ListNode *_tail; 
public: 
    typedef const void* const Index;//need a way to represent something like 'index' or 'position' 
    CList():_tail(0) 
    { 

    } 
    void print()const; 
    void insert(Index pos, const int &value); 
    Index find(/*some condition*/); 
}; 

중첩 수준 ListNode 그냥 구현하는 데 사용됩니다, 그래서 CList의 사용자가 ListNode에 액세스 할 수 있습니다하지 않을 것입니다. 그러나 목록이므로 사용자는 새 노드를 어떤 위치에 삽입 할 수 있으므로 회원을 Index (색인을 수정해서는 안됩니다!) 추가합니다. 그러나 그것은 어리 석다. 그리고 나는 그것을 수동으로 ListNode*에 던져 넣어야한다. 이것을 할 수있는 우아한 방법이 있습니까? 또는 중첩 된 클래스를 사용하는 것은 구걸에 단지 실수입니다.

+0

나는 이것이 전혀 이해가 안간다. 실제로 "ListNode"에 대한 포인터 인 "Index"를 제공하면 이미 액세스 할 수 있습니다. 내가 원하는대로 포인터를 유지하고 변경할 수 있습니다. 'void * '뒤에 숨기면 아무것도 바뀌지 않습니다. 단순히'Insert (const T & value)'를 가지고 내부적으로 노드를 생성해야합니다. 그런 다음'T 찾기 (const T & value)'를 가질 수 있습니다. 물론'std :: list' 만 사용하면됩니다. –

+0

하지만 사용자는 중첩 된 비공개 클래스'ListNode'를 볼 수 없으므로 'ListNode *'로 캐스트 할 수 없습니다. – Donglei

답변

0

컨테이너의 위치를 ​​처리하는 표준 C++ 방식은 물론 반복기를 사용합니다. 반복기는 내부적으로 ListNode에 대한 포인터를 보유하고 참조 해제 operator*()operator->()을 사용하여 지정된 위치의 요소에 대한 액세스를 제공 할 수 있습니다. 두 개의 반복자는 동일한 위치 (즉, 동일한 내부 ListNode)를 가리키는 지 비교할 수 있습니다. find() 작업 외에도 insert() 작업은 반복기를 제공 할 수 있습니다. ... 물론, erase() 회원은 요소를 제거하기 위해 반복자를 사용할 수 있습니다.

당신은 또한 예를 들어, 표시 등, 어떤 종류의가 필요합니다 find() 완벽을 지원하기 위해하는 ListNode에보다는 null로 가리키는 단수 반복자는 요소가 발견되지 않았 음을 나타냅니다.

+0

그래, 이미 이터레이터에 대해서 생각해 봤어. 이 간단한 구현에서는 너무 무겁습니다. 나는 그것에 대해 다시 생각해야한다. 어쩌면'반복자'는 내가해야만하는 것일 수도 있습니다. – Donglei

관련 문제