0

私は C++ を学んでおり、スタックとヒープ メモリを使用して Vector3D クラスを実装するタスクが割り当てられています。偶然にも、オーバーロード + メソッドに渡される Vector3DStack オブジェクト v の保護されたメンバー フィールド x、y、および z にアクセスできることに気付きました。

class Vector3DStack
{
public:
    Vector3DStack(double, double, double);

    double getMagnitude() const;

    double getX() const;
    double getY() const;
    double getZ() const;

    Vector3DStack operator + (Vector3DStack);
    Vector3DStack operator - (Vector3DStack);
    Vector3DStack operator * (double);
    Vector3DStack operator / (double);
    Vector3DStack operator % (Vector3DStack);

    double operator * (Vector3DStack);

protected:
    double x, y, z;
};

保護されていると宣言されている場合、C++ が Vector3DStack パラメータ v の x、y、および z 保護フィールドへのアクセスを許可するのはなぜですか? v.getX()、v.getY()、および v.getZ() を使用する必要があると予想していました。

Vector3DStack Vector3DStack::operator + (Vector3DStack v)
{
    return Vector3DStack (x + v.x, y + v.y, z + v.z);
}

どうもありがとう、ジョージ

4

1 に答える 1

1

operator+関数をメンバー関数として実装したためです。

の場合には

Vector3DStack operator + (const Vector3DStack& v);

特に問題ではありません - Vector3DStackクラスの 2 つのオブジェクトを追加しています。

それが来るならそれは重要です

Vector3DStack operator * (double s);

その場合Vector3DStack、左の値としてのみ持つことができるので、次のようになります。

... 
vec = vec + 5; // is ok
vec = 5 + vec; // isn't

2 番目のバージョンでは、クラス外でオーバーロードを実装する必要があります。

Vector3DStack operator * (double s, const Vector3DStack& v);
Vector3DStack operator * (const Vector3DStack& v, double s);

その場合、演算子関数は class のプライベート メンバーに到達できませんVector3DStack

この場合、演算子関数をフレンドとして宣言できます。フレンド関数は、クラスのプライベート メンバーにアクセスできます。

追加の更新: const 参照でオブジェクトを渡す必要があります。

于 2013-10-19T23:03:56.587 に答える