一些(相关的?)背景:
我有一个类在 c++ 中提供类似迭代器的功能。它用于解压缩大型数据集。在幕后,我有一个CompressedData
目标。迭代器类迭代压缩数据并返回未压缩Data
对象
Data ExpandingIterator::operator*() const;
解引用操作符返回一个 Data 而不是 Data& 因为在任何地方都没有存储可以保存未压缩的 Data 对象。例如,压缩数据可能包含以下三个条目:
- 5'3',
- 3个'1',
- 6个'0'
然后,当您使用 ExpandingIterator 迭代此集合时,您将获得:
3, 3, 3, 3, 3, 1, 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
}
但这给我留下了错误消息:类型'Data'没有重载成员'operator ->'。进行更多研究,并基于此处的答案,我相信有一些可能的解决方案:
- 也给“数据”一个 -> 运算符。不幸的是,我认为这只会将我对问题的误解推到 Data 对象中,在那里我会遇到与我在这里遇到的完全相同的问题
- 返回指向“数据”对象的指针。不幸的是,Data 对象并不真正存在于可以指向的位置,所以这似乎是一个非首发
- 给 Data 一个隐式对象以进行指针转换 - 这对我来说似乎很荒谬。
- 放弃并回家。只需执行 (*Data).Method() 并被 c++ 击败。
有人可以帮助消除对 -> 运算符应该如何实现的误解(或缺乏理解)吗?