2

私はVector3c ++で3次元ベクトルクラス(と呼ばれる)を作成しています。現在、<<ベクトルのすべてのコンポーネントを一度に直接出力できるように、ストリーム挿入演算子 ( ) をオーバーロードしようとしています。MSDからシンタックスをコピーしましたが、3 つのエラーが発生します。

エラー: 'const Vector3' を 'float Vector3:: getX() ' の 'this' 引数として渡すと、修飾子が破棄されます [-fpermissive]
エラー: 'const Vector3 ' を 'float Vector3:: getY () ' の'this' 引数として渡します修飾子を破棄します [-fpermissive]
エラー: 'const Vector3 ' を 'float Vector3:: getZ ()' の 'this' 引数として渡すと、修飾子が破棄されます [-fpermissive]

(違いは太字で示されています)

Vector3.hpublic の下に、次の関数宣言を入力しました。

friend ostream& operator<<(ostream &os, const Vector3 &vector);

Vector3.cpp、私はそれを実装しました:

ostream& operator<<(ostream& os, const Vector3& vector)
{
    os << "(" << vector.getX() << ", " << vector.getY() << ", " << vector.getZ() << ")" << endl;
    return os;
}

(x, y, z)x、y、および z 変数に従って、次のように出力する必要があります。

余談ですが、ベクトル オブジェクトはアドレス ポインターであるため、vector.getX()行ではドットの代わりに を使用しないでください。->

4

3 に答える 3

7

const関数に修飾子を追加しますget...

class Vector3
{
    public:
        float getX() const {return x;};
};

修飾された関数は、単にクラスのインスタンスでconst呼び出すことができることを意味します。constここでは、ゲッターは何も変更しません。ただし、それを指定しない場合、コンパイラは認識しないため、const変数の何かを変更する可能性のある関数を呼び出すことは許可されていません。

const正しさについてはこちらで読むことができます。

そして、ドット表記は正しいです。vectorpointerではなく、参照です(つまり、他の の別の名前ですVector3&表記は初心者にとって少し混乱する可能性があると思います。大まかに: 変数に適用すると、そのアドレスが取得されます。それが型の一部であるとき、それはその型が参照であることを意味します.例えば、hereまたはhereを参照してください.

于 2012-08-14T13:46:02.207 に答える
2

getX、getY、およびgetZ関数をconstとして宣言していないと思われます。それらがオブジェクトの状態を変更しないことを確認できないため、コンパイラーはそれらを使用させません。

それらの宣言を次の形式に変更できるはずです。

float Vector3::getX() const
于 2012-08-14T13:48:08.307 に答える
1
float Vector3::getX()

に変更する必要があります

float Vector3::getX() const
于 2012-08-14T13:47:15.777 に答える