一些(相关?)背景:
我有一个类在c ++中提供类似迭代器的功能。它用于解压缩大型数据集。在幕后,我有一个CompressedData
对象。迭代器类迭代压缩数据并返回未压缩的Data
对象
Data ExpandingIterator::operator*() const;
取消引用运算符返回数据而不是数据&因为任何地方都没有存储空间来保存未压缩的Data对象。例如,压缩数据可以包含以下三个条目:
然后,当您使用ExpandingIterator迭代此集合时,您将得到:
3,3,3,3,3,1,1,0,0,0,0,0,0
3s和1s和0s同时不存在于数组中的某个地方。它们从压缩数据中一次一个地扩展。现在,真实数据比简单的整数更复杂。有数据,时间戳和其他方法可以将数据转换为其他形式的数据。
问题: 我已经成功实现了上面提到的解引用运算符。问题是当我使用ExpandingIterator并想要访问Data对象上的一个方法时,我最终写了
(*iterator).Method()
我更愿意写
iterator->Method();
到目前为止,这个问题的解决方案似乎很明显。我需要实现 - >运营商。这最初似乎很简单,但我担心我会遗漏一些东西(可能是非常明显的东西)
起初,我试过了:
Data ExpandingIterator::operator->() const{
return **this; //Just call the regular dereference operator
}
但是这给我留下了错误信息:类型'数据'没有重载成员'运算符 - >'。更多的研究,基于this answer here我相信有一些可能的解决方案:
有人可以帮助清除对 - >的误解(或缺乏理解)算子应该被实现吗?
答案 0 :(得分:2)
要重载operator->()
,您最终需要获得实际指针,例如T const*
以获得合适的类型T
。当您返回与operator->()
指针不同的内容时,编译器将在返回的对象上调用operator->()
。
从它的声音来看,在你的情况下从Data
返回ExpandingIterator::operator->()
对象可能是合理的,该对象在给定位置填充相应的数据。当然,Data
需要另一个可以返回的operator->()
,例如,指向自身的指针,即this
,假设Data
具有您要调用的实际成员函数
原则上,在最终到达实际想要返回指针的对象之前,您可能有多个间接。但是,一旦你返回一个Data
对象,你手上就有一个实体想要调用一个成员函数,因此返回指向它的指针应该可行。请注意,临时规则仍然适用,即如果您返回Data
个对象,它将在完整表达式的末尾消失。
答案 1 :(得分:2)
您可以在迭代器中定义一个可以将->
操作委托给Data
指针的辅助类。
class ExpandingIterator {
//...
struct DataPtr {
Data data;
DataPtr () {}
DataPtr (const Data &d) : data(d) {}
Data * operator -> () { return &data; }
}
//...
DataPtr operator -> () const { return **this; }
//..
};