【发布时间】:2012-03-23 15:10:12
【问题描述】:
我已经编写了自己的通用树实现,在为它编写迭代器时,我遇到了 const 正确性的问题。我目前遇到的问题如下:
这是我编写的 DFS 迭代器的头文件:
template<class Item>
class DFSIterator
{
public:
DFSIterator(const Item& rRootNode);
~DFSIterator();
DFSIterator* First();
DFSIterator* operator++(int rhs);
Item* operator*() const;
Item* operator->() const;
bool isDone() const;
template <class Node> friend class Node;
private:
void initListIterator(const Item* currentNode);
bool m_bIsDone;
const Item* m_pRootNode;
const Item* m_pCurrentNode;
ListIterator<Item>* m_pCurrentListIter;
std::map<const Item*, ListIterator<Item>*> m_listMap;
};
所以我关心的是解引用操作符:
template<class Item>
Item* DFSIterator<Item>::operator*() const
{
if(isDone())
{
return NULL;
}
else
{
return const_cast<Item*>(m_pCurrentNode);
}
}
在那里做一个 const_cast 合适吗?我想知道如果用户将 const 对象放入容器中,这是否会导致问题?
【问题讨论】:
-
该运算符重载,实质上使
item->operator*()等同于const_cast<Item*>(item)。 (至少,只要!isDone()。)那么为什么不首先使用const_cast? -
这是一个很不寻常的
operator*...
标签: c++ iterator const-cast