C ++メソッドから参照を返す
-
02-10-2019 - |
質問
親愛なる友人、私が次の方法でC ++で参照を悪い使用しているのではないかと心配
MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
MatrizEsparsa me(outra.linhas(),outra.colunas());
return me;
}
しかし、次の変更により、警告は消えます。
MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
MatrizEsparsa me(outra.linhas(),outra.colunas());
MatrizEsparsa &ref = me;
return ref;
}
前者の方法(「ref」変数を返す)は正しいですか?
解決
いいえ。 ref
まだ言及しています me
コールの最後に破壊されます。
結果のコピーを返品する必要があります(以前に付けられていません &
).
MatrizEsparsa MatrizEsparsa::operator+(const MatrizEsparsa& outra) const {
return MatrizEsparsa(outra.linhas(),outra.colunas());
}
2つも追加しました const
私が疑っているので、仕様(パラメーターと方法へ) outra
または、この場合に呼び出しインスタンスを変更する必要があります。 (私は間違っているかもしれませんが、それからあなた operator+
奇妙なセマンティックがあります)
あなたがしたことをすることで、あなたはちょうどコードをより複雑にしました。コンパイラはおそらく混乱しており、あなたの可能性のある間違いについて警告することができませんでした。
通常、簡単なことをするために巧妙なトリックを使用する必要がある場合、それは何かが間違っていることを意味します。
他のヒント
あなたはあなたのオペレーターを間違えていると思います。
2があります:
struct Foo
{
Foo& operator+=(Foo const&);
Foo operator+(Foo const&) const;
};
ご存知のように、最初のものはそれ自体への参照を返しますが、2番目のものはそうではありません。
また、一般に、2つ目は自由関数として記述する必要があります。
Foo operator+(Foo const&, Foo const&);
これは、boost.operatorsを使用して扱いにくいため、自動化できます。
struct Foo: boost::addable<Foo>
{
Foo& operator+=(Foo const& rhs)
{
// add
return *this;
}
};
小さいもの boost::addable
魔法は自動的に生成されます +
に基づく実装 Foo::operator+=
.
受け入れられません。実際には同じ問題です。メソッドを返した後に破壊されるローカルオブジェクトへの非コンスト参照を返すことです。
いいえ、ここで値を返す必要があります。理想的には const
価値。効果的なC ++、アイテム21を参照してください。
次のインターフェースをお勧めします。
const MatrizEsparsa operator+(const MatrizEsparsa& left, const MatrizEsparsa& right);
すべてがaであることに注意してください const
参照またはa const
価値。返品a const
値は、値を返したり、パラメーターを宣言したりするほど重要ではありません const
参考文献ですが、スコット・マイヤーズの議論は私を納得させましたが、誰も彼らに従っていません。
参照しているオブジェクトがコントロールの外で破壊されるため、参照を返すことはできません。 「ME」をMatrizesParsaのメンバー変数として配置して、関数の実行後に持続するようにします。
しかし、これは +演算子であるため、おそらく関数の内部の変数への参照ではなく、値を返したいと思うでしょう。