2014-01-14 62 views
0

我有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,或者寫一個轉換函數。 有幫助嗎?

回答

1

您已將iterator作爲基類const_iterator,所以iterator構造函數將(也應該)作爲構造const_iterator的一部分被調用。

+0

這就是我所懷疑的。有沒有辦法繞過它,而不是讓他們兩個不同的類沒有繼承? – littlerunaway

+0

@littlerunaway:如果有一個很好的理由有一個「是 - 一個」關係(即繼承),那麼必須構造基類。如果沒有充分的理由來建立「是」關係,那麼就放棄繼承。後者在這種情況下可能更合適。 –

+0

@littlerunaway:目前,'const_iterator'有2個'Node *','const_iterator'可以使用'iterator'中的那個(如果你保留繼承),所以你需要調用正確的構造函數。 – Jarod42

0

如果您將定義數據存儲爲

const Map<int, int> data; 

,而不是

Map<int, int> data; 

開始的const版本()和end()將被調用。

此外,C++ 11標準容器爲此增加了cbegin()cend()。你可以重新定義它如下:

const_iterator cbegin()const{ 
    return const_iterator(firstKey); 
} 
const_iterator cend()const{ 
    return const_iterator(dummyKey); 
} 
+0

我剛纔提到我不能這樣做,將Map定義爲const。 – littlerunaway

+0

@littlerunaway請檢查cbegin()/ cend()添加 – vershov

+0

不能使用這些函數的標準版本。也提到了 – littlerunaway

相關問題