• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы DarkKnight
  • Дата начала
D

DarkKnight

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

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!