2010-07-07 54 views
1

我有兩個非常讀取和寫入的不同行爲。在讀取的情況下,我想複製一個很難提取數據結構的緩衝區。在寫入時,我只會寫入無緩衝的結構。何時調用const操作符[],何時調用非常量操作符[]?

到目前爲止,我一直在使用operator []來進行訪問,所以爲了多態性,我想繼續這樣做。

所以我的問題是這樣的:當進行訪問時,哪個版本被調用?我的想法是,const被稱爲讀取,非const用於寫入。在這種情況下,這是一個簡單的實現。否則,它可能會更棘手。

回答

7

來完成你想要什麼,你通常需要有operator[]返回一個代理,和過載operator=operator T(其中T是原始型)爲代理類型。然後你可以使用operator T來處理讀取,而operator =來處理寫入。

編輯:代理的基本思想非常簡單:您返回代替原始對象的對象實例。目前,這將有真正的微不足道的語義(只讀和向一個向量指定的索引寫一個字符);在你的情況下,operator=和(特別是)operator T內部的邏輯顯然會更復雜,但對基本結構幾乎沒有影響。

#include <vector> 

class X { 
    std::vector<char> raw_data; 

    class proxy { 
     X &parent; 
     int index; 
    public: 
     proxy(X &x, int i) : parent(x), index(i) {} 

     operator char() const { return parent.raw_data[index]; } 

     proxy &operator=(char d) { 
      parent.raw_data[index] = d; 
      return *this; 
     } 
    }; 
public: 
    X() : raw_data(10) {} 
    proxy operator[](int i) { return proxy(*this, i); } 
}; 

#ifdef TEST 

#include <iostream> 

int main() { 
    X x; 
    for (int i=0; i<10; i++) 
     x[i] = 'A' + i; 

    for (int i=0; i<10; i++) 
     std::cout << x[i] << "\n"; 
    return 0; 
} 
#endif 
3

重載分辨率基於this參數,即 - 關於您稱爲operator[]的對象的常量或缺少常量。

-2

這取決於你在 「分配」 到什麼:

const type& x=X[i] 

會調用該函數的const版本

type& x=X[i] 

X[i]=x 

將調用非const版本。最後,一個簡單的任務

type x=X[i] 

有沒有真正的方式來說,一個是「讀」,另一個是「寫」。基本上,const版本會將視圖返回到您的數據中,而不會反映更新。非常量版本會將視圖返回到您的數據中,在此處可以反映更新,但寫入後沒有提供刷新的語義。

0

由於讀取和寫入操作的行爲是如此不同,你可能要至少考慮不超載operator[]而是使獨立readwrite方法。

要回答你的問題,它基於你操作的對象的一致性。它不知道你將如何處理操作符的結果,因此它只有一件事情要處理,即調用操作符的對象。如果對象是非const的,它將始終調用操作符的非常量(寫入)版本。你可以通過將const加到對象上,但是單獨的方法似乎是一種更好的方法。

相關問題