2011-08-16 36 views
4

質問は、[] []をオーバーロードすることができるかどうかです。C++オーバーロード:[] []演算子のオーバーロード

正常な状況では、ベクター<ベクター< int>>のように、[]オペレータをオーバーロードしています。

だけに特別な意味を定義した場合、[] []それは、このようなオペレータ

+9

'[] []'演算子はありません。 – Hobblin

+0

[別の関連するポインタ](http://stackoverflow.com/a/2216055/179910)。 –

答えて

15

特殊な[] []演算子はありません。演算子[]は別の演算子[]の結果に適用されます。

最初の演算子に[]演算子も持つ特殊な一時オブジェクトを返させることで、[] []構文に特別な意味を与えることができます。

11

を持つことが可能である場合にはいいえ、あなたは自身が[]をオーバーロードした値を返すように[]をオーバーロードする必要があります。

1

2つの演算子があります。 オブジェクトのベクトルを返す演算子[]をオーバーロードする必要があります。

0

C++の添字演算子は[]です。この "object [] []"のような構文を使用すると、演算子[]を呼び出して最初のオブジェクトをscubscriptし、次に2番目の演算子[]を最初のオブジェクトで選択して呼び出します。

この演算子が存在しないため、実質的に "[] []"演算子をオーバーロードできません。コンテナオブジェクトの添え字演算子をオーバーロードし、それを内部オブジェクトにもオーバーロードする必要があります。

3

他の人が指摘しているように、オペレータはありません。[]オペレータの結果には[] オペレータが適用されています。最も一般的な の場合、最初の[]演算子は、 自体を実装するプロキシを返します。[]演算子。最も単純な場合、“プロキシ” は、C++ではポインタが[]演算子を実装しているため、T*になります。 より一般的な実装はの線に沿って次のようになります。

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.'は動作しません。 –

関連する問題