2011-08-16 174 views
4

問題是重載[] []是否可能。C++重載:重載[] []運算符

那麼在正常情況下,像矢量< vector < int>>,我們超載了[] opertor。

但在如果定義了一個特殊的意義[] []的情況下,纔有可能有這樣的運營商

+9

沒有'[] []'操作符。 – Hobblin

+0

[另一個相關指針](http://stackoverflow.com/a/2216055/179910)。 –

回答

15

沒有特殊的[] []運算符;它的運算符[]應用於另一個運算符[]的結果。

通過讓第一個操作符返回一個特殊的臨時對象,它也有[]操作符,可以爲[] []構造賦予特殊的含義。

11

不,你將不得不超負荷[]返回本身也[]超載的值。

1

有兩個操作符。 要做你想做的事情,你必須重載運算符[],它返回對象的向量。

0

C++中的下標運算符是[]。當你使用像這樣的語法「object [] []」時,你要調用operator []來在第一個對象上scubscript,然後在第一個對象上選擇第二個操作符[]。

從財務角度看,您不能重載運算符「[] []」,因爲該運算符不存在。您應該重載容器對象上的下標操作符,然後在內部對象中重載它。

3

正如其他人所指出的那樣,沒有[][]運營商,這是一個[] 操作者施加在[]操作的結果。在最一般的 的情況下,第一個[]運營商將返回代理,該代理實現 本身運營商[]。在最簡單的情況下,「代理」 可以是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->,並要求 客戶端代碼使用->,而不是.,即使它不是一個真正的 指針,智能或以其他方式。

+0

+1爲寫作這麼多努力,用一個例子來說明。 :-) – Nawaz

+0

順便說一句,爲什麼'不可能支持像容器[i] [j] .x'這樣的東西?我想我們可以。在你的代碼中,不需要'ElementProxy'。相反,如果'RowProxy'定義了一個'value_type row *'成員,那麼'operator []'可以簡單地做到這一點:'return row [columnIndex];'。通過這種方式,人們可以編寫'container [i] [j] .x'。 – Nawaz

+0

@Nawaz如果您使用'value_type *'作爲元素代理,則沒有問題。但是,假設您正在實現某種稀疏矩陣,其中沒有C風格(子)向量形式的完整行。或者你只是想在行和列索引上進行邊界檢查。一旦你需要元素代理的類類型,你就卡住了; 'operator.'不起作用。 –