难以实施 - >结构解引用算子

时间:2013-09-16 21:48:14

标签: c++ iterator operator-overloading

一些(相关?)背景: 我有一个类在c ++中提供类似迭代器的功能。它用于解压缩大型数据集。在幕后,我有一个CompressedData对象。迭代器类迭代压缩数据并返回未压缩的Data对象

Data ExpandingIterator::operator*() const;

取消引用运算符返回数据而不是数据&因为任何地方都没有存储空间来保存未压缩的Data对象。例如,压缩数据可以包含以下三个条目:

  • 5'3's,
  • 3'1's,
  • 6'0s'

然后,当您使用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我相信有一些可能的解决方案:

  1. 给'数据'a - >运营商也是。不幸的是,我认为这只会将我对问题的误解推到Data对象中,我将遇到与此处相同的问题
  2. 返回指向“数据”对象的指针。不幸的是,Data对象实际上并不存在于可以指向的位置,因此这似乎是一个非首发
  3. 给数据一个隐式对象到指针转换 - 这对我来说似乎没有意义。
  4. 放弃回家。只需做(* Data).Method()并被c ++击败。
  5. 有人可以帮助清除对 - >的误解(或缺乏理解)算子应该被实现吗?

2 个答案:

答案 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; }
    //..
};