构造函数和类的转换

时间:2014-01-14 13:55:35

标签: c++ class constructor

我有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,或者写一个转换函数。 任何帮助?

2 个答案:

答案 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);
}