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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.86
Ti]v[
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
12.10.2009, 13:09     Перегрузка индексации #1
Здраствуйте. Подскажите пожалуйста, как перегрузить операцию двойной индексации. Это нужно чтобы получить доступ к элементу двумерного массива, расположеного в неком объекте.

Пробовал сделать так: operator[][](int i, int j) { ... } - ни работама
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pigah
 Аватар для pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
12.10.2009, 13:14     Перегрузка индексации #2
C++
1
2
3
int* operator[](int index){
  return  matrix[index];
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
12.10.2009, 13:18     Перегрузка индексации #3
Операция индексации "некоего объекта" должна возвращать вспомогательный объект, а операция индексации этого вспомогательного объекта - уже ссылку на элемент массива. Вот так приблизительно:
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
class YourClass
{
    friend class Tmp;
    int a[5][5];
    class Tmp
    {
        YourClass &your_class;
        int i;
        Tmp(YourClass &your_class_, int i_):
                your_class(your_class_), i(i_) {}
        Tmp(const Tmp &);
        friend class YourClass;
    public:
        int &operator[](int j) { return your_class.a[i][j]; }
    };
public:
    Tmp operator[](int i) { return Tmp(*this, i); }
};
 
int main()
{
    YourClass y;
    y[3][4]=5;
    int m=y[3][4];
    return 0;
}
Ti]v[
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
12.10.2009, 13:33  [ТС]     Перегрузка индексации #4
pigah массив та двумерный. Япросто тему слишком абстрактно описал.

Хотя если int* - указатель на вложенный массив, то возможно получится.

Добавлено через 7 минут
CheshireCat "некоего объекта" должна возвращать вспомогательный объект
Почти. У меня проще - не объект а массив. Двумерный динамический массив целых чисел находится "внутри класса". Нужно получить ссылку наего элементы.


C++
1
2
3
4
5
6
class my_class {
    private:
        int **Massiv; // Указатель на двумерный массив
    public:
        мега_код_перегрузки (int i, int j) { return Massiv[i][j]; }
};
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
12.10.2009, 13:44     Перегрузка индексации #5
Дык, перегружай, как я показал. Именно твой случай. int** Massiv или int Massiv[что-то][что-то] - без разницы.
Ti]v[
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
12.10.2009, 13:56  [ТС]     Перегрузка индексации #6
Спасибо буду пробовать

Добавлено через 9 минут
только запутался ещё больше....
delias
4 / 4 / 0
Регистрация: 16.07.2009
Сообщений: 87
09.01.2010, 19:58     Перегрузка индексации #7
а как быть в таком случае? есть массив строк.
нужно перегрузить строку так: s[1]="feee";

C++
1
2
3
4
int operator[] (int n){
        ...
    return *str[n];
    }
как в оператор перегрузки поместить сишную строку?
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 717
09.01.2010, 20:33     Перегрузка индексации #8
C++
1
2
3
4
char * operator[] (int index)
    {
        return ptr[index];
    }
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
09.01.2010, 20:49     Перегрузка индексации #9
Ti]v[,

Подскажите пожалуйста, как перегрузить операцию двойной индексации.

никак. в с++ перегрузок ни двойной, ни десятерной индексации не предусмотрено.
для достижения желаемого эффекта читать про паттерн proxy
delias
4 / 4 / 0
Регистрация: 16.07.2009
Сообщений: 87
09.01.2010, 20:57     Перегрузка индексации #10
Цитата Сообщение от Андрейка Посмотреть сообщение
C++
1
2
3
4
char * operator[] (int index)
    {
        return ptr[index];
    }
а как произвести копирование в таком случае моей строки в массив?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.01.2010, 20:57     Перегрузка индексации #11
Цитата Сообщение от Rififi Посмотреть сообщение
для достижения желаемого эффекта читать про паттерн proxy

Не по теме:

Далеко послал


Вот код из книги А. Голуба Правила программирования на C и C++.
Как раз таки реализация операции индексации для двумерного массива.
Извиняюсь за слегка корявый вид.
1 #include <iostream.h>
2
3 class int_array
4 {
5 class row
6 {
7 friend class int_array;
8 int *first_cell_in_row;
9
10 row( int *p ) : first_cell_in_row(p) {}
11 public:
12 int &operator[] ( int index );
13 };
14
15 int nrows;
16 int ncols;
17 int *the_array;
18
19 public:
20 virtual
21 ~int_array( void );
22 int_array( int rows, int cols );
23
24 row operator[] (int index);
25 };
26 //========================================================
27 // функции-члены класса int_array
28 //========================================================
29 int_array::int_array( int rows, int cols )
30 : nrows ( rows )
31 , ncols ( cols )
32 , the_array ( new int[rows * cols])
33 {}
34 //--------------------------------------------------------
35 int_array::~int_array( void )
36 {
37 delete [] the_array;
38 }
39 //--------------------------------------------------------
40 inline int_array::row int_array::operator[]( int index )
41 {
42 return row( the_array + (ncols * index) );
43 }
44 //========================================================
45 // функции-члены класса int_array::row
46 //========================================================
47 inline int &int_array::row::operator[]( int index )
48 {
49 return first_cell_in_row[ index ];
50 }
51
52 //========================================================
53 void main ( void ) // ..♣
54 {
55 int_array ar(10,20); // то же самое, что и ar[10][20], но
55 // размерность во время компиляции
56 ar[1][2] = 100; // может быть не определена.
57 cout << ar[1][2];
59 }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 23:32     Перегрузка индексации
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
amigo11
Сообщений: n/a
05.06.2013, 23:32     Перегрузка индексации #12
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Вот код из книги А. Голуба Правила программирования на C и C++.
Как раз таки реализация операции индексации для двумерного массива.
Подниму старую ветку (тут это не осуждается?)

Всем здравствуйте!
Безуспешно пытаюсь сделать шаблонным класс, приведённый CyBOSSeR, и не понимаю, что тут не не нравится компилятору (использую mingw + codeblocks под виндой).
Было бы интересно сделать класс двумерного (в перспективе - и более высокой размерности) массива для любого типа данных.

array.h : (ругань на строку 35)
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
36
37
38
template <class QType> class int_array
{
    template <class PType> class row
    {
        friend class int_array<PType>;
        PType *first_cell_in_row;
        row<PType>( int *p ) : first_cell_in_row(p) {}
    public:
        PType &operator[] ( int index );
    };
    int nrows;
    int ncols;
    int *the_array;
public:
    virtual
    ~int_array( void );
    int_array( int rows, int cols );
    row<QType> operator[] (int index);
};
 
template <class QType> int_array<QType>::int_array( int rows, int cols ) 
: nrows ( rows ), ncols ( cols ), the_array ( new int[rows * cols])
{}
 
template <class QType> int_array<QType>::~int_array( void )
{
    delete [] the_array;
}
 
template <class QType> inline int_array<QType>::row<QType> int_array<QType>::operator[]( int index )
{
    return row<QType>( the_array + (ncols * index) );
}
 
template <class QType> inline QType &int_array<QType>::row<QType>::operator[]( int index ) // Тут ошибка!
{
    return first_cell_in_row[ index ];
}
main.cpp :
C++
1
2
3
4
5
6
7
#include <iostream>
#include "array.h"
 
int main(){
    int_array<int> p(10,10);
    return 0;
}
Компилятор:
Error: specializing member 'int_array<QType>::row<QType>::operator[]' requires 'template<>' syntax
Гугление по "requires template<> syntax" ни на что внятное меня не натолкнуло, логически код вроде бы корректен, потому спрашиваю тут.
Подскажите, в чём же тут ошибка и как это можно обойти или исправить.
Yandex
Объявления
05.06.2013, 23:32     Перегрузка индексации
Ответ Создать тему
Опции темы

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