2013-06-24 91 views
2

我知道可以覆蓋C++ 中的索引操作[],並使用類內部數據(例如數組)處理。 是否可以覆蓋[] []並像兩個維數組一樣工作?覆蓋索引操作

回答

3

是的,這是可能的(和std :: vector是這樣的類的一個例子)。

你應該在你的類或結構中重載operator []。

如果您使用的正整數來索引數據可能簽名將是:

RETURN_TYPE operator[] (size_type n); 

UPD:如果希望具有非負整數作爲密鑰可以使用矢量的矢量二維數據結構:

std::vector<std::vector<YOUR_TYPE>> vector_name; 
+0

你有一個例子如何做到這一點。但std :: vector不是二維 – user1913557

+0

看我的更新 –

0

確實可以;通常情況下,您應該重載[]返回一個對行類型對象的引用,並在該行類型對象上重載[]以產生對標量的引用。

您還應該考慮重載指針解引用以保持[x]*(... + x)的等同性。

+0

你的第二個建議真的取決於有問題的類的類型。我無法真正想象'std :: vector v(100); *(v + 7)= 5;'是合法代碼。 – Angew

+0

@Angew;確實。因此需要考慮。如果你正在寫一個矩陣類,那麼我認爲你應該。 – Bathsheba

0

比方說,你有一個數組arr,每當你想接取arr[x][y]用於爲例它的(arr[x])[y]等價所以首先arr[x]的評估(我們將其命名爲a),然後a[y]評價,所以你必須重載只是[]運營商。

+0

但是(arr [x]) - 必須返回一維數組和一個[y] - 一個值,如何爲兩個不同的返回類型重載一個運算符? – user1913557

+0

@ user1913557數組? NOP。它返回一個指針。 '[]'操作符的左手邊總是一個指針。 –

1

爲了實現它,您需要重載operator[]以返回一些也具有operator[]的對象。例如:

class Proxy { 
    std::vector<int>::iterator it; 
    //constructor; 
    int operator[] (size_t pos) { 
     return *(it + pos); 
    } 
} 

class MyMatrix { 
    std::vector<std::vector<int>> v; 
    Proxy operator[] (size_t pos) { 
     return Proxy(v[pos].begin()); 
    } 

} 
+1

注意,如果你沒有進行邊界檢查,並且你使用了一個單一的維度實現,那麼一個指針是一個足夠的'Proxy':int * operator [](int i){return&v [i * columns]; }'。同樣,如果你的實現,'std :: vector &'是一個合適的代理。 –