1
我想從Stroustrup的C++書中測試「checked迭代器」的例子。該代碼有一個運行時錯誤:「列表迭代器不兼容」。檢查迭代器
錯誤由函數「valid()
」的「if(c->end() == p)
」觸發。這個錯誤是什麼意思?我猜c->end()
和p
都應該是list<int>::iterator
。
另外,我不明白爲什麼「運營商」是以這種方式實施的。順便說一句,我正在使用VS2008。
struct out_of_bounds{
out_of_bounds() {}
};
template<class Cont, class Iter = typename Cont::iterator>
class Checked_iter : public iterator_traits<Iter> // deriving from iterator_traits
{
Iter curr; // iterator for current position
Cont* c; // pointer to current container
// ...
public:
void valid(Iter p){
if (c->end() == p)
return;
for (Iter pp = c->begin(); pp != c->end(); ++pp){
if (pp == p)
return;
}
throw out_of_bounds();
}
friend bool operator==(const Checked_iter& i, const Checked_iter& j){
return i.c == j.c && i.curr == j.curr;
}
// no default initializer
// use default copy constructor and copy assignment
Checked_iter(Cont x, Iter p) : c(&x), curr(p) { valid(p); }
reference operator*(){
if (curr == c->end()) throw out_of_bounds();
return *curr;
}
pointer operator->(){
return &*curr; // checked by *
}
Checked_iter operator+(difference_type d){ // for random-access iterator only
if (c->end() - curr <= d )
throw out_of_bounds();
return Checked_iter(c, curr+d);
}
reference operator[](difference_type d){ // for random-access iterator only
if (c->end() - curr <= d ) throw out_of_bounds();
return c[d];
}
Checked_iter& operator++(){ // prefix ++
if (curr == c->end()) throw out_of_bounds();
++curr;
return *this;
}
Checked_iter& operator++(int) { // postfix ++
Checked_iter temp = *this;
++*this; // checked by prefix ++
return temp;
}
Checked_iter& operator--() { // prefix --
if (curr == c->begin()) throw out_of_bounds();
--curr;
return *this;
}
Checked_iter& operator--(int) { // postfix --
Checked_iter temp = *this;
--*this; // check by prefix
return temp;
}
difference_type index() { return curr-c.begin(); } // random-access only
Iter unchecked(){ return curr; }
};
void f2(list<int>& ls){
int count = 0;
try{
Checked_iter< list<int> > p(ls, ls.begin());
while(true){
++p;
++count;
//cout << "element: " << *p << " count: " << count << endl;
}
}
catch(out_of_bounds){
cout << "overrun after " << count << " tries \n";
}
}
void test9(){
int a[] = {0,1,2,3,4,5,6,7,8,9};
list<int> l(a, a+sizeof(a)/sizeof(int));
show(l);
f2(l);
}
啊,好的,不知道我在想什麼。評論已刪除。 –
代碼的變量名稱有點令人困惑。 f()中的p與valid()中的p不同。但我認爲這並不重要。 – ubbdd