оператор [] [] C++

Я хотел бы перегрузиться operator[][] предоставлять внутренний доступ к 2D массиву символа в C++.

Прямо сейчас я только перегружаюсь operator[], который идет что-то как

class Object
{
    char ** charMap ;
    char* operator[]( int row )
    {
        return charMap[row] ;
    }
} ;

Это работает хорошо.. Действительно ли возможно переопределить operator[][] хотя?

8
задан bobobobo 28 March 2010 в 03:29
поделиться

5 ответов

Не пытайтесь делать это - как говорили другие, перегрузка оператора [] таким образом, как вы, фактически предоставляет синтаксис [][] бесплатно. Но это нехорошо.

Напротив, он разрушает инкапсуляцию и сокрытие информации вашего класса, обращая наружу деталь реализации - указатель char * . В общем, это не рекомендуется.

Лучшим способом было бы реализовать оператор [,] , который принимает более одного аргумента, или действительно оператор [] [] . Но ни того, ни другого не существует в C ++.

Таким образом, обычный способ сделать это - полностью исключить оператор [] для более чем одного измерения. Чистая альтернатива - использовать вместо него operator () , потому что этот оператор может иметь более одного аргумента:

class Object
{
    char ** charMap ;
    char& operator ()(int row, int column)
    {
        return charMap[row][column];
    }
};

Для получения дополнительной информации см. Статью в C ++ FAQ Lite .

18
ответ дан 3 November 2019 в 12:27
поделиться

Нет оператора [][]: это две [] операции подряд. Вы можете:

  • заставить Object :: operator [] вернуть объект второго класса, представляющий строку, который имеет собственный метод operator [] , который принимает номер столбца;
  • Напишите метод get (int row, int column) и используйте его вместо перегрузки оператора. Я бы рекомендовал это, если только ваш объект не должен вести себя как массив.
17
ответ дан 3 November 2019 в 12:27
поделиться

Насколько мне известно, не существует такой вещи, как оператор [] [] . Что вы можете сделать, так это вернуть из своего метода operator [] что-то, что перегружено operator [] .

На самом деле вы делаете это сейчас, потому что возвращаете char * , который можно снова проиндексировать с помощью [] .

2
ответ дан 3 November 2019 в 12:27
поделиться

Не существует operator[][][]. При оценке a[x][y] сначала вызывается operator[] на a, а затем operator[] снова на его результате.

Таким образом, operator[] вашего объекта должен вернуть другой объект с собственным operator[], который затем получит доступ к запрошенному значению.

5
ответ дан 3 November 2019 в 12:27
поделиться

Оператора [][] нет. На самом деле происходит то, что второй [] работает с переменной, возвращаемой первым []. Поскольку эта функциональность уже существует, возникла бы двусмысленность, если бы существовал оператор [][] .


Например: допустим, у вас есть переменная x некоторого типа T .

T x = new T();

Если мы используем оператор [] , скажем, возвращается переменная другого типа Q :

Q y = x[0];

А затем с помощью оператора [] для переменной типа Q может возвращать переменную типа R :

R z = y[0];

Следовательно, x [] [] возвращает переменную типа R.

Допустим, мы действительно смогли перегрузить [][] для типа T, так что он возвращал тип S:

S a = x[0][0];

Компилятор не мог узнать, должен ли он использовать оператор [][] для x , чтобы вернуть тип S или используйте оператор [] дважды подряд, чтобы вернуть переменную типа R . Это двусмысленность, о которой я говорил выше.


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

Но лучшее решение здесь (как уже упоминалось в , другой ответ ) - использовать другой оператор, например () .

0
ответ дан 3 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: