2013-08-25 36 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

我不確定這是否有任何意義。如果我爲您提供一個「Index」,它實際上是一個指向ListNode的指針,我已經可以訪問它。我可以保持指針並隨意改變它。將它隱藏在「void *」之後並不會改變任何內容。您應該只需要一個'Insert(const T&value)'並在內部創建節點。然後你可以有一個'T Find(const T&value)'。當然,你可以使用'std :: list'並完成它。 –

+0

但用戶無法看到嵌套的私人類'ListNode',不能將其轉換爲'ListNode *'。 – Donglei

回答

0

處理容器中位置的規範C++方法當然是使用迭代器。迭代器可以在內部保存指向您的ListNode的指針,並使用解引用operator*()operator->()來提供對給定位置處元素的訪問。兩個迭代器可以比較以確定它們是否指向相同的位置(即,到相同的內部ListNode)。除了find()操作之外,insert()操作還可以提供迭代器。 ...當然,erase()成員可以使用迭代器刪除元素。

要完全支持find(),您還需要某種指示符,例如指向null的單數迭代器,而不是指向ListNode,以指示未找到該元素。

+0

是的,我已經想過迭代器了。在這個簡單的實施過程中實施起來太重了。我必須再考慮一次。也許'迭代器'就是我必須去的。 – Donglei

相關問題