簡體   English   中英

難以實現 - >結構解引用運算符

[英]Difficulty implementing the -> structure dereference operator

一些(相關?)背景:我有一個類在c ++中提供類似迭代器的功能。 它用於解壓縮大型數據集。 在幕后,我有一個CompressedData對象。 迭代器類迭代壓縮數據並返回未壓縮的Data對象

Data ExpandingIterator::operator*() const;

解除引用運算符返回數據而不是數據&因為沒有任何存儲空間可以保持未壓縮的Data對象。 例如,壓縮數據可能包含以下三個條目:

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

然后,當您使用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
}

但是這給我留下了錯誤信息:類型'數據'沒有重載成員'運算符 - >'。 更多的研究,基於這個答案,我相信有一些可能的解決方案:

  1. 給“數據”a - >運算符。 不幸的是,我認為這只會將我對問題的誤解推到Data對象中,我將遇到完全相同的問題,我在這里
  2. 返回指向“數據”對象的指針。 不幸的是,Data對象實際上並不存在於可以指向的位置,所以這看起來像一個非首發
  3. 給數據一個隱含的對象到指針轉換 - 這對我來說似乎沒有意義。
  4. 放棄回家。 只需做(* Data).Method()並被c ++擊敗。

有人可以幫助清除對如何實施 - >運算符的誤解(或缺乏理解)嗎?

要重載operator->() ,最終需要得到一個實際指針,例如,對於合適的類型TT const* 當您從operator->()返回不同於指針的內容時,編譯器將在返回的對象上調用operator->()

從它的聲音來看,在你的情況下從ExpandingIterator::operator->()返回一個Data對象可能是合理的,它會在給定位置填充相應的數據。 當然, Data就需要另一個operator->()可能返回,例如,一個指向自身,即this假設Data有,你要撥打的實際成員函數。

原則上,在最終到達實際想要返回指針的對象之前,您可能有多個間接。 但是,一旦你返回一個Data對象,你手上就有一個實體想要調用一個成員函數,因此返回一個指向它的指針應該可行。 請注意,臨時值的規則仍然適用,即,如果返回Data對象,它將在完整表達式的末尾消失。

您可以在迭代器中定義一個可以將->操作委托給Data指針的輔助類。

class ExpandingIterator {
    //...
    struct DataPtr {
        Data data;
        DataPtr () {}
        DataPtr (const Data &d) : data(d) {}
        Data * operator -> () { return &data; }
    }
    //...
    DataPtr operator -> () const { return **this; }
    //..
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM