Перегрузка подстрочного оператора [] - PullRequest
3 голосов
/ 04 марта 2011

Почему для его работы требуется быть функцией-членом класса и целесообразно возвращать ссылку на закрытый член?

class X
{
public:

    int& operator[] (const size_t);
    const int &operator[] (const size_t) const;

private:
    static std::vector<int> data;
};

int v[] = {0, 1, 2, 3, 4, 5};
std::vector<int> X::data(v, v+6);

int& X::operator[] (const size_t index)
{
    return data[index];
}

const int& X::operator[] (const size_t index) const
{
    return data[index];
}

Ответы [ 4 ]

3 голосов
/ 04 марта 2011
  • Относительно того, почему необходимо иметь [] в качестве участника, вы можете прочитать этот вопрос (искренне ваш).Похоже, что так оно и есть, без действительно убедительного объяснения.

  • Что касается возврата ссылки?Потому что вы хотите предоставить способ не только читать, но и (для неконстантных объектов) изменять данные.Если возвращение не было ссылкой (или каким-либо проксиром)

    v [i] = 4;

    не будет работать.

HTH

2 голосов
/ 04 марта 2011

Что касается первого вопроса, то именно так, как они решили, что это должно быть, то есть вы не можете сделать:

T operator[]( const X &, size_t );

как внешняя функция.

И да, вы можете вернуть ссылку на приватного участника, неконстантно, если вы разрешите своим пользователям писать туда, в противном случае неконстантно.

В вашем примере данные статичны, что не имеет смысла, если они являются источником того, что они возвращают.

2 голосов
/ 04 марта 2011

Это должна быть функция-член в соответствии с 13.5.5:

operator [] должен быть нестатической функцией-членом с ровно одним параметром.В нем реализован синтаксис подписки

Ссылка на закрытый член полностью в порядке и довольно распространена.Вы скрываете детали от пользователя вашего класса, но по-прежнему предоставляете необходимую вам функциональность (возможность изменять отдельные элементы)это среди всех экземпляров вашего класса

0 голосов
/ 04 марта 2011

Какой будет синтаксис для вызова не члена operator[]?Любой синтаксис для этого будет неудобно.operator[] принимает один параметр в пределах [ и ], и это обычно индекс или какой-то тип данных, необходимых для поиска объекта.

Кроме того, да, это хорошая идея, чтобы вернутьссылка, даже если это частный участник.Это именно то, что делают векторы STL, и почти любой другой класс, который я могу себе представить, который я когда-либо использовал, который обеспечивает operator[].Было бы рекомендовано, что это использование поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...