Я хотел бы перегрузиться operator[][]
предоставлять внутренний доступ к 2D массиву символа в C++.
Прямо сейчас я только перегружаюсь operator[]
, который идет что-то как
class Object
{
char ** charMap ;
char* operator[]( int row )
{
return charMap[row] ;
}
} ;
Это работает хорошо.. Действительно ли возможно переопределить operator[][]
хотя?
Не пытайтесь делать это - как говорили другие, перегрузка оператора []
таким образом, как вы, фактически предоставляет синтаксис [][]
бесплатно. Но это нехорошо.
Напротив, он разрушает инкапсуляцию и сокрытие информации вашего класса, обращая наружу деталь реализации - указатель char *
. В общем, это не рекомендуется.
Лучшим способом было бы реализовать оператор [,]
, который принимает более одного аргумента, или действительно оператор [] []
. Но ни того, ни другого не существует в C ++.
Таким образом, обычный способ сделать это - полностью исключить оператор []
для более чем одного измерения. Чистая альтернатива - использовать вместо него operator ()
, потому что этот оператор может иметь более одного аргумента:
class Object
{
char ** charMap ;
char& operator ()(int row, int column)
{
return charMap[row][column];
}
};
Для получения дополнительной информации см. Статью в C ++ FAQ Lite .
Нет оператора [][]
: это две []
операции подряд. Вы можете:
Object :: operator []
вернуть объект второго класса, представляющий строку, который имеет собственный метод operator []
, который принимает номер столбца; get (int row, int column)
и используйте его вместо перегрузки оператора. Я бы рекомендовал это, если только ваш объект не должен вести себя как массив. Насколько мне известно, не существует такой вещи, как оператор [] []
. Что вы можете сделать, так это вернуть из своего метода operator []
что-то, что перегружено operator []
.
На самом деле вы делаете это сейчас, потому что возвращаете char *
, который можно снова проиндексировать с помощью []
.
Не существует operator[][][]
. При оценке a[x][y]
сначала вызывается operator[]
на a
, а затем operator[]
снова на его результате.
Таким образом, operator[]
вашего объекта должен вернуть другой объект с собственным operator[]
, который затем получит доступ к запрошенному значению.
Оператора [][]
нет. На самом деле происходит то, что второй []
работает с переменной, возвращаемой первым []
. Поскольку эта функциональность уже существует, возникла бы двусмысленность, если бы существовал оператор [][]
.
Например: допустим, у вас есть переменная 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
. Это двусмысленность, о которой я говорил выше.
Лучше всего , если вы застряли в квадратных скобках , чтобы оператор []
возвращал переменную, которая также имеет []
перегруженную (или, возможно, переменную того же типа, с установленным флагом), и эта изначально возвращенная переменная имеет дело со второй []
.
Но лучшее решение здесь (как уже упоминалось в , другой ответ ) - использовать другой оператор, например ()
.