1

以下のコードは Distance クラスの一部です。演算子のオーバーロードは、Distance クラスのプライベート メンバーとして宣言されたフレンド関数であり、呼び出しようとしている関数はパブリック メンバーです。この関数は、Distance クラスのメンバー変数を変更しません。

2 つの参照渡しオブジェクト d1 と d2 を一定に保とうとしていますが、コンパイラは、これらの関数がプライベート変数を変更しないにもかかわらず、ConvertToInches 関数または距離クラス内にある任意の関数を呼び出して const プロパティに違反していると言っています。距離クラス内。

d1 と d2 を定数にしない場合、コンパイラは問題ありません。

この関数を呼び出すときに d1 と d2 を一定にする方法と、私が持っているものが機能しない理由を誰かが説明できますか?

ありがとう!

const Distance operator+(const Distance& d1, const Distance d2)
//this is a friend function
//declared in private section of Distance class
{
    //this function is what causes problems !!!!!!!
    d1.ConvertToInches(1, 2, 3, 4);

    Distance d3 = 3;
    return d3;
}

Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches)
//declared in public section of Distance class
{
    cMiles = cMiles * 63360;
    cYards = cYards *36;
    cFeet = cFeet * 12;

    int cSum = cMiles + cYards + cFeet + cInches;
    return cSum;
}
4

1 に答える 1

1

問題は、ConvertToInches メソッドが const として宣言されておらず、const Distance& オブジェクトでメソッドを呼び出そうとしていることです。簡単な修正は、関​​数の宣言と定義に const を追加することです。

class Distance
{
public:
    int ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const;
};

int Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const { /* ... */ }

コード スニペットのもう 1 つの小さな問題: d2 は d1 のような const 参照ではありません。

于 2014-10-05T01:35:11.497 に答える