C++ 迭代器重载成员选择与间接运算符

C++ 迭代器重载成员选择与间接运算符,c++,iterator,operators,member,indirection,C++,Iterator,Operators,Member,Indirection,因此,为了创建一个迭代器,我在这里创建了一个玩具迭代器(我知道它并不完美,只是为了提问): 类foo:公共迭代器{ 字符串(u foo),; 静态常数size\u t\u size=13; 公众: 常量字符串和运算符*(){return\u foo;} 常量foo&运算符++(){ _foo+='*'; 归还*这个; } 常量foo运算符++(int){ 自动结果=*此; _foo+='*'; 返回结果; } bool运算符==(const foo&rhs){return\u foo.empty

因此,为了创建一个迭代器,我在这里创建了一个玩具
迭代器
(我知道它并不完美,只是为了提问):

类foo:公共迭代器{ 字符串(u foo),; 静态常数size\u t\u size=13; 公众: 常量字符串和运算符*(){return\u foo;} 常量foo&运算符++(){ _foo+='*'; 归还*这个; } 常量foo运算符++(int){ 自动结果=*此; _foo+='*'; 返回结果; } bool运算符==(const foo&rhs){return\u foo.empty()!=rhs.\u foo.empty()&&&&u foo.size()%\u size==rhs.\u foo.size()%\u size;} 布尔运算符!=(常量foo&rhs){return!运算符==(rhs);} };
我了解到,需要定义成员选择操作符。间接运算符是有意义的,但是成员选择运算符在这里让我感到困惑。如何为
foo
实现成员选择运算符?

运算符->()
应返回容器中使用迭代器的指针类型。因此,如果您有一个包含
std::string
的容器,那么
iterator::operator->
应该返回
std::sting*
。在您的情况下,因为您是从派生的,所以可以使用
指针
typedef作为返回类型。

操作符->()
应该返回容器中使用迭代器的类型的指针类型。因此,如果您有一个包含
std::string
的容器,那么
iterator::operator->
应该返回
std::sting*
。在您的情况下,因为您是从派生的,所以您可以使用
指针
typedef作为返回类型

const string* operator->() const { return &_foo; }
用法示例:

foo i;
++i;
assert(i->length() == 1);
其工作方式是,编译器将生成对
operator->
的重复调用,直到返回类型为原始指针(因此在本例中,只需对
foo::operator->
进行一次调用),然后对该指针执行常规成员选择操作

用法示例:

foo i;
++i;
assert(i->length() == 1);

其工作方式是,编译器将生成对
operator->
的重复调用,直到返回类型为原始指针(因此在本例中,只需对
foo::operator->
进行一次调用),然后对该指针执行常规成员选择操作。

,前缀++运算符应该返回
foo&
而不是
const foo&
,否则您将无法执行
++(++i)
-并且它缺少
return
语句。顺便说一句,前缀++运算符应该返回
foo&
而不是
const foo&
,或者您将无法执行
++(++i)
-它缺少
return
语句。@DanielSchepler我不确定这是否是OP的错误。他们使用
std::string
作为模板参数to
iterator
,这使得
iterator::pointer
a
std::string*
,我相信类实际上应该将数据成员存储为
pointer\u foo@DanielSchepler我不确定这是否是OP的错误。他们使用
std::string
作为模板参数to
iterator
,这使得
iterator::pointer
a
std::string*
,我相信类实际上应该将数据成员存储为
pointer\u foo