我有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);
}
我想用它來使2類之間的自動轉換:
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,或者寫一個轉換函數。 有幫助嗎?
這就是我所懷疑的。有沒有辦法繞過它,而不是讓他們兩個不同的類沒有繼承? – littlerunaway
@littlerunaway:如果有一個很好的理由有一個「是 - 一個」關係(即繼承),那麼必須構造基類。如果沒有充分的理由來建立「是」關係,那麼就放棄繼承。後者在這種情況下可能更合適。 –
@littlerunaway:目前,'const_iterator'有2個'Node *','const_iterator'可以使用'iterator'中的那個(如果你保留繼承),所以你需要調用正確的構造函數。 –
Jarod42