4

クラスの非メンバー非友人のインターフェースをできるだけ多くするのは良い考えだと知っています。そして、私の3Dベクトルクラス「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;
}
4

3 に答える 3

2

あなたが持っているものは私には似合います。

ちなみに、operator +の場合は、+=で実装するのが一般的です。(lhsのコピーを作成してから、lhs + = rhsを呼び出して、結果を返します)

このトリックをすでに知っているかどうかはわかりませんが、これらの演算子を実装するための標準的な方法について懸念しているので、言及しても問題ありません。:)

于 2009-05-16T20:41:21.940 に答える
1

あなたが持っているものはよさそうだ。

これを直感的に考える基本的な方法は、コードを作成するときにコードをどのように見せたいかを考えることです。この場合、あなたが書くことができるなら

Vector v, w;

v += w;
w += v;

などなど、あなたは正しい方向に進んでいます。

役立つ良いルールがたくさんあります。詳細については、C++FAQのこのエントリを参照してください。

于 2009-05-16T20:44:01.780 に答える
0

私は「可能な限り多くのインターフェース」とは言いません。友達じゃない、メンバーじゃないoperator+=、などで得られるものはあまりありません。operator-=

一部の人々は、プライベートメンバー変数を使用する誘惑に抵抗するために、すべての関数を非メンバー非フレンド関数にできるようにすることを好みます。しかし、あなたは大人です。関数をパブリックメンバーとして記述でき、プライベートメンバー変数を使用することはできません。関数がクラスに関連付けられていることを知りたいのですが、それをパブリックメンバーにすると、明示的になります。

余談
ですが、個人的には、パブリックアクセサーの代わりにプライベートメンバーを使用しても大丈夫だと思います(私は知っています-私は地獄で燃えます)。常にではない!-しかし、しばしば。
実際、必要だと判断した場合に、数分でパブリックアクセサーに切り替えることができなかったケースはほとんどありません。しかし、私はそれが人気のある見方ではないことを認識しており、人々にその哲学に従うように求めません。

確実な関数と演算子を「非友達、非メンバー」にする具体的な理由があります。たとえば、「ストリーム挿入演算子」として使用する場合、operator <<()は、lhsクラス(ストリーム)を変更する必要があるため、メンバーにすることはできません。

于 2009-05-16T20:43:40.703 に答える