C++ 使用构造函数自动转换
我有两门课:C++ 使用构造函数自动转换,c++,class,C++,Class,我有两门课: class iterator { public: Node<K,V>* n; iterator():n(NULL){} iterator(const iterator& iter):n(iter.n){} explicit iterator(Node<K,V>* nodePtr):n(nodePtr) {} vo
class iterator {
public:
Node<K,V>* n;
iterator():n(NULL){}
iterator(const iterator& iter):n(iter.n){}
explicit iterator(Node<K,V>* nodePtr):n(nodePtr) {}
void 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;
};
//----const_iterator-class---------------------------
class const_iterator : public iterator {
public:
const Node<K,V>* n;
const_iterator():n(NULL);
const_iterator(const const_iterator& iter):n(iter.n){}
const_iterator(const iterator& iter):n(iter.n){}
explicit const_iterator(const Node<K,V>* node):n(node){}
void operator=(const const_iterator& iter){
n=iter.n;
}
void operator++(){
n = n->next;
}
};
当iter.n(n所指的值)从迭代器转换为常量迭代器后,尝试访问iter.n中的内容时,为什么会出现分段错误?m.begin()和.end可能会返回一个临时值
所以你需要的是
class const_iterator {
public:
const_iterator(const iterator &iter) {}
};
下面是演示这种转换的代码:
#include <iostream>
class iterator {
public:
iterator() { i = -1; }
int i;
void bar() const { std::cout << "iterator::bar() " << i << std::endl; }
};
class const_iterator : public iterator {
public:
const_iterator(int ii) : i(ii) {}
const_iterator(const iterator &it) : i(it.i) {}
const int i;
void bar() const { std::cout << "const_iterator::bar() " << i << std::endl; }
};
void foo(const const_iterator &it) {
it.bar();
}
int main() {
iterator it;
it.i = 777;
foo(it);
return 0;
}
#包括
类迭代器{
公众:
迭代器(){i=-1;}
int i;
void bar()const{std::cout请清除并格式化您将参数作为非const
引用的代码,这意味着您不能使用此参数转换临时对象。您能告诉我们错误的确切代码吗?对于(Map::const_迭代器it=m.begin();it!=m.end();++it){m.begin返回迭代器,我希望它自动转换为常量迭代器,因为编写运算符const\u iterator()更容易
foriterator
。然后,您可以轻松构造常量迭代器,而不需要const迭代器&
argumentm.begin和m.end返回迭代器的副本。为什么会出现错误:对`mtm::Map::iterator::iterator()的未定义引用
#include <iostream>
class iterator {
public:
iterator() { i = -1; }
int i;
void bar() const { std::cout << "iterator::bar() " << i << std::endl; }
};
class const_iterator : public iterator {
public:
const_iterator(int ii) : i(ii) {}
const_iterator(const iterator &it) : i(it.i) {}
const int i;
void bar() const { std::cout << "const_iterator::bar() " << i << std::endl; }
};
void foo(const const_iterator &it) {
it.bar();
}
int main() {
iterator it;
it.i = 777;
foo(it);
return 0;
}