問題是重載[] []是否可能。C++重載:重載[] []運算符
那麼在正常情況下,像矢量< vector < int>>,我們超載了[] opertor。
但在如果定義了一個特殊的意義[] []的情況下,纔有可能有這樣的運營商
問題是重載[] []是否可能。C++重載:重載[] []運算符
那麼在正常情況下,像矢量< vector < int>>,我們超載了[] opertor。
但在如果定義了一個特殊的意義[] []的情況下,纔有可能有這樣的運營商
沒有特殊的[] []運算符;它的運算符[]應用於另一個運算符[]的結果。
通過讓第一個操作符返回一個特殊的臨時對象,它也有[]操作符,可以爲[] []構造賦予特殊的含義。
不,你將不得不超負荷[]
返回本身也[]
超載的值。
有兩個操作符。 要做你想做的事情,你必須重載運算符[],它返回對象的向量。
C++中的下標運算符是[]。當你使用像這樣的語法「object [] []」時,你要調用operator []來在第一個對象上scubscript,然後在第一個對象上選擇第二個操作符[]。
從財務角度看,您不能重載運算符「[] []」,因爲該運算符不存在。您應該重載容器對象上的下標操作符,然後在內部對象中重載它。
正如其他人所指出的那樣,沒有[][]
運營商,這是一個[]
操作者施加在[]
操作的結果。在最一般的 的情況下,第一個[]
運營商將返回代理,該代理實現 本身運營商[]
。在最簡單的情況下,「代理」 可以是T*
,因爲在C++中,指針實現了[]
運算符。 A 更通用的實現方式可能與此類似:
class ElementProxy
{
Container* myOwner;
int myRowIndex;
int myColumnIndex;
public:
ElementProxy(Container* owner, int rowIndex, int columnIndex)
: myOwner(owner)
, myRowIndex(rowIndex)
, myColumnIndex(columnIndex)
{
}
operator Type() const // lvalue to rvalue conversion
{
return myOwner->get(myRowIndex, myColumnIndex);
}
void operator=(Type const& rhs) const
{
myOwner->set(myRowIndex, myColumnIndex, rhs);
}
};
class RowProxy
{
public:
RowProxy(Container* owner, int rowIndex)
: myOwner(owner)
, myRowIndex(rowIndex)
{
}
ElementProxy operator[](int columnIndex) const
{
return ElementProxy(myOwner, myRowIndex, columnIndex);
}
};
這並不完美;如果你正在處理班級類型,例如 不可能支持container[i][j].x
行;我們不能 超載operator.
。如果您需要支持這一點,你 能做的最好是在ElementProxy
超載operator->
,並要求 客戶端代碼使用->
,而不是.
,即使它不是一個真正的 指針,智能或以其他方式。
+1爲寫作這麼多努力,用一個例子來說明。 :-) – Nawaz
順便說一句,爲什麼'不可能支持像容器[i] [j] .x'這樣的東西?我想我們可以。在你的代碼中,不需要'ElementProxy'。相反,如果'RowProxy'定義了一個'value_type row *'成員,那麼'operator []'可以簡單地做到這一點:'return row [columnIndex];'。通過這種方式,人們可以編寫'container [i] [j] .x'。 – Nawaz
@Nawaz如果您使用'value_type *'作爲元素代理,則沒有問題。但是,假設您正在實現某種稀疏矩陣,其中沒有C風格(子)向量形式的完整行。或者你只是想在行和列索引上進行邊界檢查。一旦你需要元素代理的類類型,你就卡住了; 'operator.'不起作用。 –
沒有'[] []'操作符。 – Hobblin
[另一個相關指針](http://stackoverflow.com/a/2216055/179910)。 –