Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 174
#1

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

15.11.2012, 21:15. Просмотров 896. Ответов 8
Метки нет (Все метки)

Собсно код с книжки списал. Понятно что данный класс на векторе построен (понятно, что можно на основе любого контейнера зафигачить), однако остается большим вопрос зачем обязательно ДВА оператора индексирования, зачем их перегружать, зачем нужно именно ДВА варианта?
Ну и так же непонятно зачем было ссылку писать а не 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];
     }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора индексирования (C++):

Перегрузка оператора индексирования - C++
Что-то не выходит каменный цветок. Определение класса: struct TEventData { char strComputerName; }; class TEventDataSet { ...

Перегрузка оператора индексирования - C++
Всем привет! Ситуация такая - есть 2 класса, поле одного класса является массивом из элементов второго класса. Необходимо переопределить...

перегрузка индексирования - C++
на пример как перегрузить оператор индексирования с 2-мя параметрами: f

Перегрузка индексирования строками - C++
Пишу динамический массив, состоящий из строк. Возможно ли перегрузить оператор индексирования для строк? Т.е. чтобы можно было писать не...

Аналог перегрузки оператора индексирования (operator []) - C++
Как по-другому(то есть в виде обычной функции или как то ещё) можно записать перегрузку оператора индексирования? Например в моём случае:...

Перегрузка операции индексирования, вопрос по синтаксису - C++
Здравствуйте форумчане. Должна сразу сказать, что в своей практике с С++ сталкивалась мало, поэтому в нем считаю себя новичком. Но все же...

8
DiffEreD
1431 / 768 / 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;
}
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 22:08 #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
int& Oracule::operator[](const size_t index)
этот const не имеет смысла
1
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)
а без конст метода не получится обращаться к константному объекту
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.11.2012, 22:42 #5
Цитата Сообщение от Jupiter Посмотреть сообщение
этот const не имеет смысла
По мне так вполне имеет. Вот в прототипе действительно бессмысленно его указывать.
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 22:45 #6
Цитата Сообщение от gray_fox Посмотреть сообщение
По мне так вполне имеет.
в чем же?
параметр передается по значению потому от этого const ни холодно, ни жарко
только глаз режет и с толку сбивает - "а что автор хотел сказать этим const?"
1
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 174
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& сидел рисовал.... =)
Вот наваял в паинте
Перегрузка оператора индексирования
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.11.2012, 22:57 #8
Цитата Сообщение от Jupiter Посмотреть сообщение
"а что автор хотел сказать этим const?"
То что он не будет менять значение переменной (да, кэп). Согласен, что выглядит излишним, но, ИМХО, может помочь избежать мелких ошибок.

Добавлено через 51 секунду
В любом случае на сигнатуру это не влияет.
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 23:05 #9
Цитата Сообщение от gray_fox Посмотреть сообщение
То что он не будет менять значение переменной
или то что автор писал код "не в сознании" и упустил звездочку/амперсанд.
со стороны это в большинсве случаев будет выглядить именно так.
нужна именно константа? создай её локалько
0
15.11.2012, 23:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 23:05
Привет! Вот еще темы с ответами:

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора < - C++
Здравствуйте. Есть класс треугольник(Triangle), надо перегрузить оператор &lt; для объектов класса Triangle. Написал код, вроде ошибок нет, но...

Перегрузка оператора - C++
Здравствуйте, друзья. Помогите пожалуйста найти ошибку, вернее я знаю где, но пока не понимаю как её исправить: //Добавить в строковый...

Перегрузка оператора = - C++
Ещё раз всем привет! Недавно разместила у себя &quot;лайт-вершин&quot; своего вектора - int_array. И все дружно начали мне говорить, что у меня...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.