1

いくつかの演算子を定義しようとしています。

私はこのドキュメントに従ってそれを行います:

http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

2 回定義する必要がある演算子はありますか?

インデックス演算子だと思います。私は正しいですか?次のように定義しました。

int operator [] (const int power) const{
    // here there is some code
}

正しく実装したと仮定すると、2 回定義する必要がある演算子についてはどうでしょうか。

次のことをサポートしていますか?

a[1] = 3;
cout << a[1]; // I defined the << operator

どんな助けでも大歓迎です!

4

3 に答える 3

2

オペレータのconsta バージョンと非バージョンの両方が必要な場合があります。const

int operator[](int index) const { ... }
int& operator[](int index) { ... }

これにより、例に示されている両方の使用法が許可されます。であっても2回目の使用も許可しaますconst

于 2013-04-21T15:25:25.997 に答える
2

インデックス演算子だと思います。私は正しいですか?

ほとんど。これは添字演算子と呼ばれ、 1つの引数を受け入れる必要があります。オペレーターは 2 つを受け入れるため、コードは違法になります。

次のことをサポートしていますか?

適切に記述されていると仮定するとoperator [](アプリケーションのロジックからコンテキストを知らずに、記述方法がわからない)、言及した両方の指示がサポートされるはずです。

ただし、これを行うには:

a[1] = 3;

(基本的な型が返される場合) 合法であるoperator []ためには、左辺値参照を返す必要があります。したがって、ではint&ありませんint。もちろん、これは左辺値参照がバインドされているオブジェクトがローカル オブジェクトまたは一時オブジェクトであってはならないことを意味します

int& operator [] (const int power) { // <== The function cannot be "const" if you
// ^                                 //     are returning a non-const lvalue ref
                                     //     to a data member or element of a data
                                     //     member array
    // here there is some code
}

const添え字演算子のバージョンが必要な場合もあります。

int operator [] (const int power) const {
// No need to use a int const&    ^^^^^
// here, that is basically the    This member function can be const, since it is
// same as returning an int by    neither modifying the object on which it is
// value                          invoked, nor returns any non-const lvalue ref
                                  to a data member or an element of data member
    // here there is some code
}
于 2013-04-21T15:24:08.340 に答える
1

割り当てをサポートするには、2 つのオプションがあります

  1. インデックス演算子[]は参照を返します
  2. インデックス演算子[]は、代入を実装するプロキシ オブジェクトを返します

最初のケースは最も単純ですが、読み取り操作と書き込み操作を区別できません。2 番目の方法はもう少し複雑ですが、より多くの制御が可能です。

アプローチ(2)の例は次のとおりです

struct MyArray {
    std::vector<int> v;

    MyArray(int n) : v(n) {}

    struct ItemRef {
        MyArray& a;
        int index;

        ItemRef(MyArray& a, int index)
          : a(a), index(index)
        {}

        int operator=(int x) {
            printf("Writing to element %i\n", index);
            a.v[index] = x;
            return x;
        }

        operator int() {
            printf("Reading element %i\n", index);
            return a.v[index];
        }
    };

    ItemRef operator[](int index) {
        if (index < 0 || index >= int(v.size()))
            throw std::runtime_error("Invalid index");
        return ItemRef(*this, index);
    };
};
于 2013-04-21T15:32:37.150 に答える