7

クラスIntervalで[]演算子をオーバーロードして、またはを返しました。

しかし、 []演算子を使用してまたはに値を割り当てる方法がわかりません。

例:このステートメントを使用できます

cout << a[1] << "min and " << a[0] << "sec" << endl;

しかし、[]演算子をオーバーロードしたいので、を使用して分または秒に値を割り当てることもできます

a[1] = 5;
a[0] = 10;

私のコード:

#include <iostream>

using namespace std;

class Interval
{

public:

    long minutes;
    long seconds;

    Interval(long m, long s)
    {
        minutes = m + s / 60;
        seconds = s % 60;
    }

    void Print() const
    {
        cout << minutes << ':' << seconds << endl;
    }

    long operator[](int index) const
    {
        if(index == 0)
            return seconds;

        return minutes;
    }

};

int main(void)
{
    Interval a(5, 75);
    a.Print();
    cout << endl;

    cout << a[1] << "min and " << a[0] << "sec" << endl;
    cout << endl;

}

メンバー変数をプライベートとして宣言する必要があることは知っていますが、便宜上、ここではパブリックとして宣言しました。

4

7 に答える 7

11

値の代わりに、問題のメンバーへの参照を返します。

long &operator[](int index)
{
    if (index == 0)
        return seconds;
    else
        return minutes;
}
于 2010-10-04T10:45:20.710 に答える
8

constを削除して参照を返すことにより、関数のシグネチャを変更します。

long& operator[](int index)

これで、次のようなステートメントを記述できるようになります。

a[0] = 12;
于 2010-10-04T10:44:34.000 に答える
6

ハードコードされた「インデックス」値を使用するためにop[]をオーバーロードすることは、ここでは意味がありません。実際には、クラス定義にすでに解決策があります。

cout << a.minutes << "min and " << a.seconds << "sec" << endl;

それらをパブリックデータメンバーの代わりにメソッドに変えることができます。これは、op[]をオーバーロードしないためには重要ではありません。ただし、書き込みアクセスも必要なため、メソッドの唯一の利点は検証です(たとえば、0 <=秒<60をチェックする)。

struct Interval {
  int minutes() const { return _minutes; }
  void minutes(int n) { _minutes = n; }  // allows negative values, etc.

  int seconds() const { return _seconds; }
  void seconds(int n) {
    if (0 <= n and n < 60) {
      _seconds = n;
    }
    else {
      throw std::logic_error("invalid seconds value");
    }
  }

  // rest of class definition much like you have it

private:
  int _minutes, _seconds;
};

// ...
cout << a.minutes() << "min and " << a.seconds() << "sec" << endl;
于 2010-10-04T10:42:46.907 に答える
3

値を代入して代入演算子のLHSで使用できるようにするには、参照によって戻ります。

于 2010-10-04T10:41:56.367 に答える
3

メソッドを以下のように変換すると、次のようになります。

long& operator[](int index) 
于 2010-10-04T10:44:37.033 に答える
1

配列インデックスメンバー演算子は、次のように指定する必要があります。

long& operator[](int index);                    // for non const object expressions

long const& operator[](int index) const;        // for const object expressions
于 2010-10-04T10:48:19.957 に答える
1

サブスクリプト演算子をオーバーロードする場合の混乱を避けるために、サブスクリプト演算子のバージョンconstnon-constバージョンを使用することをお勧めします。

long& operator[](int index);  // non-const function returning reference

long const& operator[](int index) const;// const function returning const reference

を使用A[1] = 5して、でオブジェクトを変更しようとしていますindex 1。したがって、非constバージョンのsub-script演算子が自動的に呼び出されます。

を使用cout << A[1]すると、でオブジェクトを変更しませんindex 1。したがって、sub-script演算子のconstバージョンが自動的に呼び出されます。

于 2012-01-20T05:30:07.587 に答える