Operator[] (Реализация лево и право-стороннего)

DarkKnight

Well-known member
01.08.2010
653
0
#1
Народ, возник такой вопрос, раньше как то с этим делом отношение не имел, всегда реализовывал однозначно через ссылку, а сейчас нужно что бы если вызываемый оператор был сугубо для чтения возвращалась константа, иначе так же как делал - ссылка
Вот пример грубый:

C++:
class C1
{
private:
int Value[10];
public:
int& operator[] (int Index)
{
return Value[Index];
}
// И как то надо правосторонний реализовать, что бы возвращал константу
//думал выйдет вот так:
//  int operator[] (int Index)const
{
return Value[Index];
} //А он "падла", все равно ссылочную реализацию вызывает
}
Если не понятно немного описал - сорьки... Вот наглядно:
C++:
C1 C;
const int a = C[2]; //Должно вернуть const int
std::cout<<C[2]; //Тоже const int
C[3]=7; // А вот тут ссылочность уже
Добавлено: Блин уже и инет глянул... И Страуструпа пролистал....
Но точно такая реализация должна быть, если логика мне не изменяет, в классе string при индексе как раз что то подобное и делается, ну и так же во всех его производных как CString(MFC) и AnsiString (Borland)...
По сути не столь важно конечно, но просто стало жуть как интересно....
Если кто-то все таки сталкивался с такой проблемой просьба отписаться....
Заранее благодарен...
 
I

ierofant

#2
Смысл здесь такой. Обычно используется оператор:
C++:
int& operator[] (int Index)
И он один реализует, то что вы хотите сразу и лево и право!!!

Но для постоянного объекта (const C1) этот оператор становится недоступным. Для этого случая перегружают ещё и:
C++:
int operator[] (int Index)const
И не ссылочная реализация будет использоваться в следующем случае:
C++:
const C1 C = C1 ();
const int a = C[2];
А использование ссылочной уже станет недоступно:
C++:
const C1 C = C1 ();
C[3] = 7; //компилятор даст ошибку