クラスのための+ =演算子の正規の形式
-
22-08-2019 - |
質問
私はそれが可能な限り、クラス非会員以外の友人のインタフェースの多くを作成することをお勧めだということを知っている、と私はちょうど私の3次元ベクトルクラス「のVector3」のため、私は移動することができますことを実現しました+ =、 - =などの演算子のクラスのうち、ちょうどコンストラクタとコピー代入演算子を残す
。質問です:この演算子は次のように何になりますか?私は、他の事業者の多くの標準的なフォームを見てきましたし、彼らのアドバイスに従いましたが、私はこれらの演算子の標準的なフォームを見ていません。私はそれが以下であるべきだと思うものを与えてくれた。
二次の質問は次のとおりです。これらの演算子も、何と呼ばれていますか?算術代入演算子?
前(関連)コード:
class Vector3 {
public:
Vector3& operator+=(const Vector3& rhs);
float x, y, z;
};
Vector3& Vector3::operator+=(const Vector3 &rhs) {
x += rhs.x;
y += rhs.y;
z += rhs.z;
return *this;
}
私がこれまでにそれを変更しました何ます:
class Vector3 {
public:
float x, y, z;
};
Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
lhs.x += rhs.x;
lhs.y += rhs.y;
lhs.z += rhs.z;
return lhs;
}
解決
あなたが持っていることは私にはよさそうだ。
あなたは演算子+に来たときにところで、+ =の面でそれを実装するのが一般的です。 (LHSのコピーを作成し、LHS + = RHSを呼び出して結果を返す)
あなたは既にこのトリックを知っている場合は、は分からないのですが、あなたはこれらの演算子を実装するための標準的な方法を懸念しているので、それを言及するために傷つけることはできません。 :)
他のヒント
あなたがよさそうだが何をしています。
このことについて考えるための基本的な方法は、直感的に、あなたはそれを書くとき、コードは次のようになりたいのですが何を考えることです。場合は、このケースでは、あなたが書くことができます。
Vector v, w;
v += w;
w += v;
というように、あなたは正しい軌道に乗っている。
助けるために親指の良いルールがたくさんあります。その上にたくさんのためのC ++のFAQでこのエントリを参照してください。
私は「可能な限りのインタフェースの多くを」言わないだろう。 operator+=
などではない、友人のいないメンバー、operator-=
を行うことによって得られることが多くはありません。
一部の人々は、プライベートメンバ変数を使用しての誘惑に抵抗する非会員非フレンド関数すべての機能を可能にすることを好みます。しかし、あなたは大人です:あなたは、パブリックメンバーとしての機能を書き、プライベートメンバ変数を使用することはできません。私は、公共のメンバーは、それが明示的に作る関数がクラスに結びついていることを知っていることを好む、それを作っています。
は別に注意します。
個人的に、私はそれが( - 私は地獄で燃えるよ、私は知っている)の代わりに、パブリックアクセサのプライベートメンバーを使用することがしばしばOKだことがわかります。常にではない! - しかし、多くの場合、
。
実際には、あなたがそれを必要と判断した場合、あなたは数分の方法で公衆アクセサにスイッチを作ることができなかったいくつかの例があります。しかし、私はそれが人気のビューではありません認識し、私はその哲学に従うことを人に聞かないでください。の
のcertaint の関数と演算子を作るための具体的な理由があり、「非フレンド、非会員」。 「ストリーム挿入演算子」のように使用するときにLHSクラス(ストリーム)を変更しなければならないので、例えば、オペレータは<<()のメンバーにすることはできません。