7

コンピューター ソフトウェア開発の学位の一環として、私のラボの 1 つは、電卓クラス テンプレートと分数クラスの作成で構成されています。

問題は私の分数クラスにあります。私の仕事は、プラス演算子をオーバーロードして、2 つの分数を加算できるようにすることです。

Fraction.cpp:

#include "Fraction.h"

const Fraction Fraction::operator+ (const Fraction &rhs) const
{
    return Fraction(_num * rhs.GetDen() + (rhs.GetNum() * _den), _den * rhs.GetDen());
}

Fraction.h

#pragma once

class Fraction
{
    public:
        Fraction(const int &num, const int &den) : _num(num), _den(den) {}
        ~Fraction(void) {}
        const int GetNum(void) { return _num; }
        const int GetDen(void) { return _den; }
        const Fraction operator+ (const Fraction &rhs) const;

    private:
        const int _num, _den;
};

Visual Studio は、分数アクセサーが「このポインターを定数分数から分数 & に変換できない」と文句を言います。私は完全に困惑しています。

4

5 に答える 5

12

アクセサーも const として修飾する必要があります。

int GetNum(void) const { return _num; }

ところで、戻り値の型を const int として修飾することは実際には意味がありません。とにかく int になります。コンパイラは警告を発するはずです。

于 2011-05-11T18:44:47.963 に答える
1
const int GetDen(void) { return _den; }

あるべき(またはかもしれない)

int GetDen(void) const { return _den; }

最初のものは const コピーを返します。コピーによる戻りは、コピーが生成され、一時オブジェクトとして呼び出し元関数に提供されることを意味します。つまり、const (「読み取り専用」) オブジェクトです。したがって、コピーで返すと、コピーは読み取り専用になります。

2 つ目は、Fraction オブジェクトが const であっても、関数を呼び出し可能にします。これは、「読み取り専用」のアクセス可能な関数です (言うかもしれません)。それはおそらくあなたが書きたかったものであり、そうでない場合は、const がないよりはましです。

ところで、パラメーターの void は C++ では役に立ちません。int GetNum() const{ return _num; }

別の詳細: アンダースコア文字で始まる名前は、標準実装用に標準で予約されています。それらを使用することはそれほど危険ではありませんが、あなたは決して知りません. それらを保持したい場合は、少なくともすべてのコードを名前空間にカプセル化してください。

于 2011-05-11T18:49:35.057 に答える
1

GetNum および GetDen アクセサー メソッドは「const」として宣言されていないため、const Fraction に対して operator+ 内で呼び出すことはできません。

于 2011-05-11T18:45:32.740 に答える
1

最初の質問は、なぜ関数に「const Fraction」を返すようにさせるのですか? これにより、コードの使用方法に任意の制限が課されます。あなたの Fraction クラスがすでに概して暗黙的に const であることは明らかです。そうする必要はありません。

ただし、メンバー関数は非 const です。つまり、クラス自体内で状態を変更しようとしないことをコンパイラーに伝えません。状態を変更しないすべてのメンバー関数のメンバー関数宣言の最後にキーワード「const」を入れてください。

于 2011-05-11T18:45:43.867 に答える
1

あなたのゲッターはconstではありません:

    int GetNum() const { return _num; }
    int GetDen() const { return _den; }
         ///    ^^^^^^^^

これらのゲッターは実際には必要ありません。個人的には捨てます。
注: クラスはそれ自体のフレンドであるため、別のインスタンスのメンバーにアクセスできます。

const Fraction Fraction::operator+ (const Fraction &rhs) const
{
    return Fraction(_num * rhs._den+ (rhs._num * _den), _den * rhs._den);
}

その他の注意事項:

  • また、パラメーターとして void を設定することはお勧めできません (これは C スタイルです)。
  • const int は、単に int を返すだけで意味がありません。
  • 最初の文字にアンダースコアを使用しないでください。それは合法ですが、注意を怠り、アンダースコアに関するすべての規則を知らなければ、簡単につまずいてしまいます。
于 2011-05-11T18:46:19.490 に答える