我在C ++中编写自己的迭代器:
class my_iterator {
entity operator*() {
...
}
my_iterator& operator++() {
...
}
}
我可以使用*运算符取消引用实体。但是,我可以让我的自定义迭代器支持->
操作(后跟一个取消引用实体的属性或方法)吗?
我是否可以实施某个运营商来支持->
?
答案 0 :(得分:2)
是的,如果你想要特殊的行为,你会重载->
,否则你会得到它在指针上的标准行为。
对于你的情况,你会有像
这样的东西entity* operator->() {
return ptr_to_entity;
}
这有点奇怪,因为->
你的重载会返回一个指向对象的指针,然后就会使用->
。
如上所述:
my_iterator_instance->foo === ptr_to_entity->foo
答案 1 :(得分:1)
是的,它被称为operator->。但请记住operator->很特别,它应该返回一个指针和常规运算符 - >将应用于该指针。所以鉴于上面的代码我无法确切地告诉你如何实现它。如果您填写运营商的详细信息*我可以提供更多帮助。
可能就是这些问题。
entity* operator->() {
...
}
答案 2 :(得分:1)
看看这个答案:Common operators to overload。您可以跳到“类似指针类型的运算符”来查找所需内容。
答案 3 :(得分:1)
我强烈建议你阅读上面写得好的
Operators for Pointer-like Types
为了定义自己的迭代器或智能指针,你必须重载一元前缀>解除引用运算符*和二进制中缀指针成员访问运算符 - >:
class my_ptr {
value_type& operator*();
const value_type& operator*() const;
value_type* operator->();
const value_type* operator->() const;
};
请注意,这些也几乎总是需要const和非const版本。对于> - > operator value_type必须是class(或struct或union)类型,否则它们的>实现会导致编译时错误。
一元地址运算符永远不应该重载。
对于operator-> *(),请参阅此问题。它很少使用,因此很少超载。在>事实上,即使是迭代器也不会使它超载。