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

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

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

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

15.11.2012, 21:15. Просмотров 756. Ответов 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];
     }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 21:15     Перегрузка оператора индексирования
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1429 / 766 / 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
Каратель
Эксперт С++
6552 / 3972 / 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
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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
15.11.2012, 22:42     Перегрузка оператора индексирования #5
Цитата Сообщение от Jupiter Посмотреть сообщение
этот const не имеет смысла
По мне так вполне имеет. Вот в прототипе действительно бессмысленно его указывать.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 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
Сообщений: 171
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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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++
Добрый пень! подскажите как написать код для реалилизации следующего требования: SpecialPrint &lt;&lt; &quot;text&quot; &lt;&lt; 'a' &lt;&lt; 1; ...

Перегрузка оператора [] - C++
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public: struct Node { Element el; ...

Перегрузка оператора << - C++
Как вот в таком классе перегрузить оператор &lt;&lt;? #ifndef MATRIXX_H #define MATRIXX_H #include &lt;iostream&gt; using namespace...

Перегрузка оператора = - C++
Скажи пожалуйста в каких случаях нужно перегружать оператор = ?


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

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

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