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

Тема в разделе "C и С++ FAQ", создана пользователем DarkKnight, 30 окт 2010.

  1. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Народ, возник такой вопрос, раньше как то с этим делом отношение не имел, всегда реализовывал однозначно через ссылку, а сейчас нужно что бы если вызываемый оператор был сугубо для чтения возвращалась константа, иначе так же как делал - ссылка
    Вот пример грубый:

    Код (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)...
    По сути не столь важно конечно, но просто стало жуть как интересно....
    Если кто-то все таки сталкивался с такой проблемой просьба отписаться....
    Заранее благодарен...
     
  2. ierofant

    ierofant Гость

    Смысл здесь такой. Обычно используется оператор:
    Код (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; //компилятор даст ошибку
     

Поделиться этой страницей