通常對於這類事情,您需要使用代理類來處理第二個索引操作符。它看起來像這樣,然後進入Matrix
課程的private
部分。我將忽略邊界檢查(你自己應該不難添加)。
class Proxy {
Matrix& ref;
size_t i;
public:
Proxy(Matrix& on, size_t i) : ref(on), i(i) {}
float operator[] (size_t j) {
return ref.Data[i][j];
}
};
然後,只需有你Matrix::operator[]
返回這個類的一個實例:
Proxy operator[] (size_t i) {
return Proxy(*this, i);
}
需要注意的是,如果你想讓一個const過載(即您要使用的索引操作上const Matrix
對象),你需要一個單獨的ConstProxy類,它有const Matrix& ref
而不是Matrix& ref
,但是在其他方面是相同的。
還有對數組返回引用的選項。 (注:作爲一個評論指出,這沒有太大的幫助與約束檢查,但我認爲這是有趣的,所以我會離開這裏。)
float (&operator[](size_t i))[4] {
return Data[i];
}
該語法是相當神祕,我相信它在Visual Studio 2013中不起作用,但是你可以用typedef使它更清潔一些。
using Proxy = float[4];
Proxy& operator[](size_t i) {
return Data[i];
}
還有一個選擇,如果你不介意放棄方括號索引。你可以重載函數調用操作是這樣的:
float operator()(size_t i, size_t j) {
return Data[i][j];
}
您需要幾個間接級別,每個類只能爲一個索引操作符重載。 –
是的,我知道 - 但是,因爲已知它是2D數組,Matrix的索引操作符可能會返回某種接口,這也可能會覆蓋其索引操作符? ......如果事實上有可能,不確定它將如何構建。 – MuertoExcobito
順便說一句,你想如何實際存儲數據?如果每行在內存中仍然是連續的,那麼你可以重載一個'operator []'來返回'float *'---行開始的地址---和第二個'[]'將被自動處理。 – Petr