Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/70: Рейтинг темы: голосов - 70, средняя оценка - 5.00
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18

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

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

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

Пробовал сделать так: operator[][](int i, int j) { ... } - ни работама
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2009, 13:09
Ответы с готовыми решениями:

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

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

Перегрузка тройной индексации
Доброго времени суток! Есть такая конструкции: class B { public: void test() { std::cout << "test\n"; } };...

11
 Аватар для pigah
12 / 12 / 5
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
12.10.2009, 13:14
C++
1
2
3
int* operator[](int index){
  return  matrix[index];
}
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.10.2009, 13:18
Операция индексации "некоего объекта" должна возвращать вспомогательный объект, а операция индексации этого вспомогательного объекта - уже ссылку на элемент массива. Вот так приблизительно:
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;
}
0
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
12.10.2009, 13:33  [ТС]
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]; }
};
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.10.2009, 13:44
Дык, перегружай, как я показал. Именно твой случай. int** Massiv или int Massiv[что-то][что-то] - без разницы.
0
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
12.10.2009, 13:56  [ТС]
Спасибо буду пробовать

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

C++
1
2
3
4
int operator[] (int n){
        ...
    return *str[n];
    }
как в оператор перегрузки поместить сишную строку?
0
425 / 229 / 87
Регистрация: 25.03.2009
Сообщений: 744
09.01.2010, 20:33
C++
1
2
3
4
char * operator[] (int index)
    {
        return ptr[index];
    }
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
09.01.2010, 20:49
Ti]v[,

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

никак. в с++ перегрузок ни двойной, ни десятерной индексации не предусмотрено.
для достижения желаемого эффекта читать про паттерн proxy
0
5 / 5 / 0
Регистрация: 16.07.2009
Сообщений: 87
09.01.2010, 20:57
Цитата Сообщение от Андрейка Посмотреть сообщение
C++
1
2
3
4
char * operator[] (int index)
    {
        return ptr[index];
    }
а как произвести копирование в таком случае моей строки в массив?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
09.01.2010, 20:57
Цитата Сообщение от 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 }
1
amigo11
05.06.2013, 23:32
Цитата Сообщение от 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" ни на что внятное меня не натолкнуло, логически код вроде бы корректен, потому спрашиваю тут.
Подскажите, в чём же тут ошибка и как это можно обойти или исправить.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2013, 23:32
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru