2012-03-28 8 views
2

[]演算子に実用的なものを初めてオーバーロードしました。 私はポインタを保持するカスタム配列のようなクラスを作成しようとしています(そしていくつかのユニークな機能を提供しています)。 []演算子を使用してクラスからポインタの1つを返すことは明白ですが、ポインタのターゲットアドレスを外部から変更することも考えていました。 私はこれを考えすぎているかもしれませんが、戻り値(fish [0] = lpHatAddress;など)に代入しても返される値は単なるアドレスなのでエラーが発生しますか?オーバーロードされた[]演算子は、値へのアクセスと設定の両方を行います(C++)

私が考えることができる唯一の解決策は、ポインターへのポインターを格納することであり、それは2倍のメモリが必要です。 明白な何かを見落としていますか? これを行うにはきれいな方法がありますか?

+0

'[]'オーバーロードのコードを表示してください。私はそれが要素への参照を返すと信じています。 –

+1

これは、参照が発明された理由のほぼ全部です。 –

+0

@SethCarnegie申し訳ありません。私が錆びていると言うのは控えめな言い方です。 :P – user980058

答えて

3

演算子の結果を参照する必要があります。したがって、データ型がintの場合、演算子はint&を返します。

+0

今、それはよく知られているようです。私は、参照による返還が存在することを完全に忘れてしまった。皮肉なことにこのようなことのために大学に行くと、私はすでに知っていたことの半分を忘れてしまった。 XD – user980058

+0

@ user980058しかし、参照によって返され、未定義の動作を引き起こさない唯一の理由は、参照が有効なものを参照するように、関数のスコープ外に参照を戻しているオブジェクトを格納するためです関数が返ってもメモリ領域。ローカル変数への参照を返すことがないことを確認してください(私はあなたがすでにそれを知っていたと確信していますが、私は安全であることを望んでいました)。 –

1

標準的なトリックはproxy (or surrogate) design patternです。目的は、const T*ポインターへの変換とターゲットポインターに代入を転送するT&の割り当ての両方をサポートするターゲットポインターを囲む一時オブジェクトを返すことです。スコットマイヤーは、彼のMore Effective C++本でこのパターンについて議論しています。

関連する問題