Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора индексирования - C++

Восстановить пароль Регистрация
 
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
15.11.2012, 21:15     Перегрузка оператора индексирования #1
Собсно код с книжки списал. Понятно что данный класс на векторе построен (понятно, что можно на основе любого контейнера зафигачить), однако остается большим вопрос зачем обязательно ДВА оператора индексирования, зачем их перегружать, зачем нужно именно ДВА варианта?
Ну и так же непонятно зачем было ссылку писать а не int в операторах, и зачем столько слов const....
Вроде все работает, но мелочи.... мелочи убивают просто.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Oracule
      {
      public:
      Oracule():as(100)
              {
              for(int ix=0;ix!=100;++ix) as[ix]=ix;
              }
      int& operator[](const size_t);
      const int& operator[](const size_t) const;
      private:
      vector<int> as;            
      };
 
int& Oracule::operator[](const size_t index)
     {
     return as[index];
     }  
const int& Oracule::operator[](const size_t index) const
     {
     return as[index];
     }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 21:15     Перегрузка оператора индексирования
Посмотрите здесь:

Перегрузка оператора C++
Перегрузка операции индексирования, вопрос по синтаксису C++
Перегрузка оператора == C++
C++ перегрузка индексирования
C++ Перегрузка оператора индексирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 22:02     Перегрузка оператора индексирования #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
 
class Oracule
{
public:
    Oracule():as(100)
    {
        for(int ix=0;ix!=100;++ix) as[ix]=ix;
    }
    int& operator[](const size_t);
    const int& operator[](const size_t) const;
private:
    std::vector<int> as;            
};
 
int& Oracule::operator[](const size_t index)
{
    return as[index];
}  
const int& Oracule::operator[](const size_t index) const
{
    return as[index];
}    
 
int main()
{
    Oracule one;
    const Oracule two;
    std::cout<<"one[10] = "<<one[10]<<std::endl;
    std::cout<<"two[10] = "<<two[10]<<std::endl; // без const int& operator[](const size_t) const проблема
    system("pause");
    return 0;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 22:08     Перегрузка оператора индексирования #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
int& Oracule::operator[](const size_t index)
этот const не имеет смысла
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
15.11.2012, 22:18     Перегрузка оператора индексирования #4
C++
1
int& Oracule::operator[](const size_t index)
без этого метода не получится изменить значение в векторе с помощью оператора индексирования
C++
1
2
Oracule a;
a[0] = 1; //int& Oracule::operator[](const size_t index)
а без конст метода не получится обращаться к константному объекту
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2012, 22:42     Перегрузка оператора индексирования #5
Цитата Сообщение от Jupiter Посмотреть сообщение
этот const не имеет смысла
По мне так вполне имеет. Вот в прототипе действительно бессмысленно его указывать.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 22:45     Перегрузка оператора индексирования #6
Цитата Сообщение от gray_fox Посмотреть сообщение
По мне так вполне имеет.
в чем же?
параметр передается по значению потому от этого const ни холодно, ни жарко
только глаз режет и с толку сбивает - "а что автор хотел сказать этим const?"
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
15.11.2012, 22:54  [ТС]     Перегрузка оператора индексирования #7
Цитата Сообщение от yuron_477 Посмотреть сообщение
std::cout<<"two[10] = "<<two[10]<<std::endl; // без const int& operator[](const size_t) const проблема
И понял и нифига не понял, почему в поток надо именно константу кидать?
Вот же нормально всегда выводило
C++
1
2
int a=123;
cout<<a;
С одним вопросом раобрался, почему int& сидел рисовал.... =)
Вот наваял в паинте
Перегрузка оператора индексирования
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2012, 22:57     Перегрузка оператора индексирования #8
Цитата Сообщение от Jupiter Посмотреть сообщение
"а что автор хотел сказать этим const?"
То что он не будет менять значение переменной (да, кэп). Согласен, что выглядит излишним, но, ИМХО, может помочь избежать мелких ошибок.

Добавлено через 51 секунду
В любом случае на сигнатуру это не влияет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 23:05     Перегрузка оператора индексирования
Еще ссылки по теме:

C++ Перегрузка оператора <
Аналог перегрузки оператора индексирования (operator []) C++
C++ Перегрузка оператора []

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 23:05     Перегрузка оператора индексирования #9
Цитата Сообщение от gray_fox Посмотреть сообщение
То что он не будет менять значение переменной
или то что автор писал код "не в сознании" и упустил звездочку/амперсанд.
со стороны это в большинсве случаев будет выглядить именно так.
нужна именно константа? создай её локалько
Yandex
Объявления
15.11.2012, 23:05     Перегрузка оператора индексирования
Ответ Создать тему
Опции темы

Текущее время: 08:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru