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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.86
Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
#1

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

12.10.2009, 13:09. Просмотров 5859. Ответов 11
Метки нет (Все метки)

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

Пробовал сделать так: operator[][](int i, int j) { ... } - ни работама
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2009, 13:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка индексации (C++):

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

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

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

Перегрузка оператора индексации - C++
Можно ли зоздать в своем классе перегрузку оператора , но с двойными скобками вроде? int &operator(int m,int n) { /*.....*/}

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
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[
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
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
12.10.2009, 13:44 #5
Дык, перегружай, как я показал. Именно твой случай. int** Massiv или int Massiv[что-то][что-то] - без разницы.
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];
    }
как в оператор перегрузки поместить сишную строку?
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
09.01.2010, 20:33 #8
C++
1
2
3
4
char * operator[] (int index)
    {
        return ptr[index];
    }
Rififi
2359 / 1054 / 44
Регистрация: 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++
2300 / 1670 / 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 }
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" ни на что внятное меня не натолкнуло, логически код вроде бы корректен, потому спрашиваю тут.
Подскажите, в чём же тут ошибка и как это можно обойти или исправить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 23:32
Привет! Вот еще темы с ответами:

Перегрузка оператора индексации и присваивания (C++) - C++
Доброго времени суток уважаемые форумчане. Возникла проблема Допустим у меня есть класс, в котором находится некий массив и нужно...

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

Перегрузка индексации двумерного динам. массива - C++
решил реализовать такое: обращение к эл-ту двумерного массива происходит следующим образом а, я решил перегрузить чтобы обращаться к...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.06.2013, 23:32
Ответ Создать тему
Опции темы

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