我讀了一些與此問題有關的其他線程,但沒有提供解決我的問題。我希望你們能給我一些想法或建議。如何爲非const類調用const_iterator?
我試圖實現這個類Map
。它應該包含2個迭代器 - iterator
和const_iterator
。
我讓他們實現 - 從const_iterator
iterator
繼承,並在Map
I類具有以下功能:
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
我們得到了一個示例文件,看看有什麼是落實需要。 在那裏,有下面的代碼:
Map<std::string,int> msi;
...
// print map
for(Map<std::string,int>::const_iterator it = msi.begin(); it != msi.end(); ++it) {
// more stuff here
}
因爲msi
是一個非const地圖實例,msi.begin()
調用iterator begin()
而不是const_iterator begin() const
,導致意外情況。
假設示例文件沒問題,我該如何讓msi.begin()
調用正確的const_iterator
函數? (考慮它,迭代器,類型爲const_iterator
)。
編輯:關於自動轉換的討論,我決定添加我的迭代器類,請指出我的錯誤。
class Map {
//...
public:
class const_iterator {
private:
Node* currNode;
public:
const_iterator(Node* cur_node = NULL) : currNode(cur_node) {}
const_iterator& operator++() {
currNode = currNode->next;
return *this;
}
const_iterator operator++(int) {
const_iterator old = *this;
++(*this);
return old;
}
bool operator!=(const_iterator const& curr) {
return !(*this == curr);
}
string operator*() {
// this might cause memory leak
string toString(this->currNode->key);
std::stringstream s;
int tmp = this->currNode->value;
s << tmp;
string secondString(s.str());
toString = toString + ":" + secondString;
return toString;
}
bool operator==(const_iterator const& curr) {
return this->currNode == curr.currNode;
}
void operator=(const_iterator target) {
this = target;
}
//void operator=(Node* target) {
// this->currNode = target;
//}
};
class iterator : public const_iterator {
private:
Node* currNode;
public:
iterator(Node* cur_node = NULL) : currNode(cur_node) {}
iterator& operator++() {
currNode = currNode->next;
return *this;
}
iterator operator++(int) {
iterator old = *this;
++(*this);
return old;
}
bool operator==(iterator const& curr) {
return *this == curr;
}
bool operator!=(iterator const& curr) {
return !(*this == curr);
}
string operator*() {
// this might cause memory leak
string toString(this->currNode->key);
std::stringstream s;
int tmp = this->currNode->value;
s << tmp;
string secondString(s.str());
toString = toString + ":" + secondString;
return toString;
}
void operator=(iterator target) {
this = target;
}
};
//..
}
爲什麼調用'iterator'版本壞究竟? – Yakk