我有2个班级:
class iterator {
Node<K,V>* n;
public:
iterator(){
std::cout<<"new empty iterator"<<std::endl;
};
iterator(const iterator& iter):n(iter.n){
std::cout<<"copy iterator"<<std::endl;
}
explicit iterator(Node<K,V>* nodePtr):n(nodePtr) {
std::cout<<"create iterator with Node Ptr"<<std::endl;
}
iterator& operator=(const iterator& iter);
void operator++();
Node<K,V>& operator*();
bool operator!=(const iterator& iter);
K& operator[](const Key& k)const;
V& operator[](const Val& v)const;
Node<K,V>* getNodePtr()const{
std::cout<<"get Node Ptr"<<std::endl;
return n;
}
friend class Map;
};
class const_iterator :public iterator {
const Node<K,V>* n;
public:
const_iterator(){
std::cout<<"new empty const_iterator"<<std::endl;
};
const_iterator(const iterator& iter):
n(iter.getNodePtr()){
std::cout<<"convert"<<std::endl;
}
const_iterator(const const_iterator& iter):n(iter.n){}
explicit const_iterator(const Node<K,V>* node):n(node){}
const_iterator& operator=(const const_iterator& iter){
n = iter.n;
return *this;
}
const Node<K,V>& operator*(){
return *n;
}
friend class Map;
};
iterator begin()const{
return iterator(firstKey);
}
iterator end()const{
return iterator(dummyKey);
}
我希望它使用以下方法在两个类之间进行自动转换:
const_iterator(const iterator& iter):
n(iter.getNodePtr()){
std::cout<<"convert"<<std::endl;
}
做类似的事情,例如:
Map<int,int>::const_iterator it = m.begin();
现在,事情是,这个构造函数调用iterator();在头等舱,我无法弄清楚为什么。 我知道begin()和end()有一些标准版本,但我不能在这里使用任何一个版本。我也不能使Map成为const,或者写一个转换函数。 任何帮助?
答案 0 :(得分:1)
您已将iterator
作为const_iterator
的基类,因此iterator
构造函数将(并且应该)作为构建const_iterator
的一部分进行调用。
答案 1 :(得分:0)
如果要将数据存储定义为
const Map<int, int> data;
而不是
Map<int, int> data;
将调用begin()和end()的const版本。
此外,C ++ 11标准容器为此目的添加cbegin()
和cend()
。您可以按如下方式重新区分它:
const_iterator cbegin()const{
return const_iterator(firstKey);
}
const_iterator cend()const{
return const_iterator(dummyKey);
}