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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,262
Записей в блоге: 17
#1

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

16.05.2012, 15:04. Просмотров 1857. Ответов 12
Метки нет (Все метки)

Можно ли зоздать в своем классе перегрузку оператора [], но с двойными скобками вроде?

C++
1
int &operator[][](int m,int n) { /*.....*/}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2012, 15:04     Перегрузка оператора индексации
Посмотрите здесь:

Перегрузка оператора индексации [] - C++
Необходимо перегрузить оператор индексации двумя способами, первый я реализовал #pragma once #include <iostream> using namespace...

Перегрузка оператора индексации [] - C++
Имеется некоторый класс почти массив. "Почти" - потому что элементы лежат в памяти не по байтам, а по битам и, соответственно, для...

Перегрузка оператора индексации - C++
Доброго вам времени суток, у меня появилась проблема з перезагузкой оператора индексации (),вот мой код: MyVectorClass.h #include...

Перегрузка оператора индексации - C++
class matrix{ double **c; int m;//кол-во строк int n;//кол-во столбцов } - часть кода подскажите, пож-ста, как перегрузить ()...

Перегрузка оператора индексации в списке - C++
Доброго времени суток. Имеется список, внутри которого соответственно структура, имеющая элемент данных int и две ссылки вперед/назад ...

Перегрузка оператора индексации для связанного списка - C++
Доброго времени суток!:) Требуется перегрузить оператор индексации для связанного списка, я так понимаю в роли списка должны выступать...

Перегрузка оператора индексации в одном классе и использование в другом - C++
Вообщем проблема состоит в том, что не понимаю как это сделать. Есть класс Document в нем есть вектор vec состоящий из Item'ов. В классе...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
16.05.2012, 15:18     Перегрузка оператора индексации #2
Avazart, Нет.
Но есть обходные возможности.
1) Возвращать указатель.
2) Реализовать прокси-класс в котором хранить данные, перегрузить в нем оператор [], хранить в вашем классе массив таких объектов, при вызове возвращать объект.

Добавлено через 5 минут
Пример.

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
35
#include <iostream>
#include <vector>
 
class Vector
{
public:
   Vector(const std::vector<int>& v):vec(v)
   {
   }
   int& operator [](const int idx) { return vec[idx]; }
private:
   std::vector<int> vec;
};
 
class Matrix
{
public:
   Matrix(const std::vector<Vector>& m):matr(m)
   {
   }
   Vector& operator [](const int idx) { return matr[idx]; }
private:
   std::vector<Vector> matr;
};
 
int main()
{
   std::vector<Vector> vec = std::vector<Vector>
   {
      Vector({1,2,3,4,5}),
      Vector({6,7,8,9})
   };
   Matrix matr(vec);
   std::cout << matr[0][0] << std::endl;
}
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
16.05.2012, 15:19     Перегрузка оператора индексации #3
По моему в таком случае удобнее перегрузить operator ().
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
16.05.2012, 15:24     Перегрузка оператора индексации #4
gray_fox, Смотря какой желателен синтаксис.
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,262
Записей в блоге: 17
16.05.2012, 15:37  [ТС]     Перегрузка оператора индексации #5
Avazart, Нет.
Но есть обходные возможности
Да понятно без костылей не как...
Странно что язык не предусматриват такой возможности...
И в тоже время существуют многомерные массивы...
Jupiter
16.05.2012, 16:33
  #6

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
И в тоже время существуют многомерные массивы...
считайте это синтаксическим сахаром

Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,262
Записей в блоге: 17
23.05.2012, 16:50  [ТС]     Перегрузка оператора индексации #7
Скорее за анизотропию.
diagon
Higher
1926 / 1192 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 17:32     Перегрузка оператора индексации #8
Цитата Сообщение от Avazart Посмотреть сообщение
И в тоже время существуют многомерные массивы...
Это просто сахар, как сказали выше.
Точнее, сахар заключается в удобном создании этих массивов.
Оператора [][] и прочего у этих массивов нету. Ибо двумерный массив - это массив указателей.
Например
C++
1
2
3
int matrix[3][3]; 
int *row = matrix[2];
row[2]; //эквивалент matrix[2][2]
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,262
Записей в блоге: 17
23.05.2012, 17:42  [ТС]     Перегрузка оператора индексации #9
C++
1
int matrix[3][3];
Я всегда считал эквивалентен по размещению
C++
1
int matrix[3*3];
Ну да ладно основную идею понял
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
23.05.2012, 18:23     Перегрузка оператора индексации #10
интересно а если выделить память так
C++
1
int (*n)[10]= malloc(sizeof(int) * 10 *5)
а обратится
C++
1
n[0][0]=0;
ведь следуя из этого

Цитата Сообщение от diagon Посмотреть сообщение
Ибо двумерный массив - это массив указателей
должна произойти ошибка обращения к памяти , я прав?
diagon
Higher
1926 / 1192 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 18:33     Перегрузка оператора индексации #11
Цитата Сообщение от Van111 Посмотреть сообщение
int (*n)[10]= malloc(sizeof(int) * 10 *5)
Вы тут память под указатели выделяете, а вот под то, на что они указывают - нет.
Поэтому да, будет ошибка обращения к памяти.
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,262
Записей в блоге: 17
23.05.2012, 18:43  [ТС]     Перегрузка оператора индексации #12
C++
1
int matrix[3][3];
И
C++
1
2
int *row = matrix[2];
row[2]; //эквивалент matrix[2][2]
Разные типы массивы...
Первый не является массивом указателей как я понимаю...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 18:46     Перегрузка оператора индексации
Еще ссылки по теме:

Перегрузка оператора индексации для класса плохо себя ведёт - C++
Собственно, есть такое дело. #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; ...

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

оператора индексации+класс+структура - C++
Задача такая нужна создать словарь терминов. 1.Создаю свой тип данных помощью struct term (слово термин) definition (определение к...

Реализовать перегрузку оператора индексации - C++
Здравствуйте! Очень нужна помощь, помогите сделать перегрузку оператора индексации. #include &lt;iostream&gt; #include &lt;string&gt; ...

Перегрузка двойной индексации - C++
есть класс с динамическим двумерным массивом. Нужно реализовать индексацию типа m class matrix{ private: int...


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

Или воспользуйтесь поиском по форуму:
diagon
Higher
1926 / 1192 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 18:46     Перегрузка оператора индексации #13
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
int matrix[3][3];
И
C++
1
2
int *row = matrix[2];
row[2]; //эквивалент matrix[2][2]
Разные типы массивы...
Первый не является массивом указателей как я понимаю...
Это все один код был.
Суть в том, что matrix[2] - указатель.
Можно даже так писать
C++
1
(matrix[2])[2];
Yandex
Объявления
23.05.2012, 18:46     Перегрузка оператора индексации
Ответ Создать тему
Опции темы

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