[英]Difficulty implementing the -> structure dereference operator
一些(相關?)背景:我有一個類在c ++中提供類似迭代器的功能。 它用於解壓縮大型數據集。 在幕后,我有一個CompressedData
對象。 迭代器類迭代壓縮數據並返回未壓縮的Data
對象
Data ExpandingIterator::operator*() const;
解除引用運算符返回數據而不是數據&因為沒有任何存儲空間可以保持未壓縮的Data對象。 例如,壓縮數據可能包含以下三個條目:
然后,當您使用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
}
但是這給我留下了錯誤信息:類型'數據'沒有重載成員'運算符 - >'。 更多的研究,基於這個答案,我相信有一些可能的解決方案:
有人可以幫助清除對如何實施 - >運算符的誤解(或缺乏理解)嗎?
要重載operator->()
,最終需要得到一個實際指針,例如,對於合適的類型T
, T 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.