我正在用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 :(得分:0)
用于处理容器中位置的规范C ++方法当然是使用迭代器。迭代器可以在内部保存指向ListNode
的指针,并使用取消引用operator*()
和operator->()
来访问给定位置的元素。两个迭代器可比较以确定它们是否指向相同的位置(即,指向相同的内部ListNode
)。除find()
操作外,insert()
操作还可以提供迭代器。 ...当然,erase()
成员可以使用迭代器来删除元素。
要完全支持find()
,您还需要某种指示符,例如,指向null而不是ListNode
的单数迭代器,以指示该元素不是{&1;}。找到了。