C++ の数値に似たクラスで算術演算子のオーバーロードを実装するための標準的または推奨されるパターンはありますか?
C++ FAQ から、ほとんどの問題を回避する例外セーフな代入演算子があります。
class NumberImpl;
class Number {
NumberImpl *Impl;
...
};
Number& Number::operator=(const Number &rhs)
{
NumberImpl* tmp = new NumberImpl(*rhs.Impl);
delete Impl;
Impl = tmp;
return *this;
}
しかし、他の演算子 (+、+= など) については、組み込み型の演算子のように振る舞うようにする以外に、ほとんどアドバイスはありません。
これらを定義する標準的な方法はありますか? これは私が思いついたものです - 私が見ていない落とし穴はありますか?
// Member operator
Number& Number::operator+= (const Number &rhs)
{
Impl->Value += rhs.Impl->Value; // Obviously this is more complicated
return *this;
}
// Non-member non-friend addition operator
Number operator+(Number lhs, const Number &rhs)
{
return lhs += rhs;
}