exs*_*ape 0 c++ iterator operator-overloading operator-keyword
(注意:我正在编写这个项目仅供学习;有关冗余的评论是......呃,多余.;)
我正在尝试实现一个随机访问迭代器,但是我发现关于这个主题的文献很少,所以我将通过试验和错误结合维基多数运算符重载原型列表.到目前为止它运作良好,但我遇到了障碍.
代码如
exscape::string::iterator i = string_instance.begin();
std::cout << *i << std::endl;
Run Code Online (Sandbox Code Playgroud)
工作,并打印字符串的第一个字符.但是,*(i + 1)不起作用,*(1 + i)也不起作用.我的完整实现显然有点太多了,但这是它的要点:
namespace exscape {
class string {
friend class iterator;
...
public:
class iterator : public std::iterator<std::random_access_iterator_tag, char> {
...
char &operator*(void) {
return *p; // After some bounds checking
}
char *operator->(void) {
return p;
}
char &operator[](const int offset) {
return *(p + offset); // After some bounds checking
}
iterator &operator+=(const int offset) {
p += offset;
return *this;
}
const iterator operator+(const int offset) {
iterator out (*this);
out += offset;
return out;
}
};
};
}
int main() {
exscape::string s = "ABCDEF";
exscape::string::iterator i = s.begin();
std::cout << *(i + 2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
以上失败(第632行当然是*(i + 2)行):
string.cpp:在函数'int main()'中:string.cpp:632:错误:'*exscape :: string :: iterator :: operator +(int)(2)'string中'operator*'不匹配. cpp:105:注意:候选人是:char&exscape :: string :: iterator :: operator*()
*(2 + i)失败:
string.cpp:在函数'int main()'中:string.cpp:632:错误:'2 + i'中不匹配'operator +'string.cpp:434:注意:候选者是:exscape :: string exscape: :operator +(const char*,const exscape :: string&)
我的猜测是我需要做更多的重载,但我不确定我缺少什么算子.
您的+运算符返回一个const迭代器,但您没有const operator*.添加一个,我想你会没事的.或者,正如下面的xtofl所建议的那样,你可以制作你的operator*const.这是更好的设计,除非你operator*出于某种原因真的需要非const .
| 归档时间: |
|
| 查看次数: |
3373 次 |
| 最近记录: |