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

相关问题