littlerunaway
littlerunaway

Reputation: 453

constructors and conversions of classes

I have 2 classes:

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

I want it to make an automatic conversion between the 2 classes using:

    const_iterator(const iterator& iter):
        n(iter.getNodePtr()){
        std::cout<<"convert"<<std::endl;
    }

to do something like this for example:

 Map<int,int>::const_iterator it = m.begin();

now, the thing is, that this constructor calls for some reason iterator(); in the first class and I can't figure out why. I know begin() and end() have some standart versions, but I can't use any of it here. I also can't make Map to be const, or write a conversion function. any help?

Upvotes: 0

Views: 66

Answers (2)

vershov
vershov

Reputation: 928

If you will define data storage as

const Map<int, int> data;

instead of

Map<int, int> data;

const version of begin() and end() will be invoked.

Also, C++11 standard containers add cbegin() and cend() for that purpose. You could re-difine it as follows:

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

Upvotes: 0

Sander De Dycker
Sander De Dycker

Reputation: 16243

You've made iterator a base class of const_iterator, so an iterator constructor will (and should) be called as part of constructing a const_iterator.

Upvotes: 1

Related Questions