Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
#1

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

14.08.2016, 05:43. Просмотров 765. Ответов 23
Метки нет (Все метки)

C++
1
2
3
4
5
6
struct Matrix
{
    int m[2][5][3];
    Matrix() {}
    ... operator[](int n) {return ...;}
};
Как перегрузить индексацию в классе чтобы можно было работать с массивом так:

C++
1
2
3
4
5
int main()
{
     Matrix M;
     cout << M[1][0][1];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2016, 05:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка многомерной индексации (C++):

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

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

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

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

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

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

23
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,846
14.08.2016, 10:29 #2
isrepeat, наверное перегрузить [] что бы возвращал объект-матрицу у которой перегружен [] что бы возвращал объект-ряд у которого перегружен [] что бы возвращал элемент
0
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 16:59  [ТС] #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
struct Matrix
{
    int m[2][5][2];
    int in1,in2,in3,pos;
    Matrix() {in1=in2=in3=pos=0;}
 
    Matrix& operator[](int n) 
    {
        pos++;
        if(pos>3) return *this; 
        if(pos==1) in1 = n;
        if(pos==2) in2 = n;
        if(pos==3) in3 = n;
        return *this;
    }
 
    int& operator ! () 
    {
        int res = m[in1][in2][in3];
        in1=in2=in3=pos=0;
        return res;
    }
};
использовать так:
C++
1
2
3
4
5
main()
{
      Matrix M;
      cout << !M[1][0][1];
}
а хочется так:
C++
1
2
3
4
5
main()
{
      Matrix M;
      cout << M[1][0][1];
}
Интересно можно сделать так чтобы при вызове 3й раз оператора [] (когда pos == 3) функция возвращала как бы другое значение? вместо Matrix& например int ?
0
Max Dark
шКодер самоучка
1866 / 1666 / 605
Регистрация: 09.10.2013
Сообщений: 3,707
Записей в блоге: 6
Завершенные тесты: 2
14.08.2016, 17:19 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <array>
using namespace std;
 
class Test {
    public:
        string operator[](array<int, 3> index) {
            string res = "";
            for(int idx:index) {
                res += to_string(idx);
            }
            return "{" + res + "}";
        }
};
 
int main() {
    Test t;
    cout << t[{1, 2, 3}] << endl;
    //cout << t[{1, 2, 3, 4}] << endl; // ошибка компиляции[OK]
    return 0;
}
http://ideone.com/idHVJl
0
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 17:34  [ТС] #5
Cra3y, использовать дополнительные фигурные скобки не хочется. хочется так как в последнем main.
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,846
14.08.2016, 19:02 #6
isrepeat, путь я вам сказал

Добавлено через 5 минут
В принципе можете перегрузить только [] на возврат int **
0
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 19:08  [ТС] #7
vxg, просто лишние структуры создавать это изврат какойто.
А можно сделать так, чтобы после 3го вызова оператора [ ], неявно вызывался к примеру оператор ! ?

Добавлено через 2 минуты
В принципе можете перегрузить только [] на возврат int **
Не, так не пойдет. Будь даже у нас n-мерный массив он все равно является одним указателем(в отличии от динамического).
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,846
14.08.2016, 19:27 #8
isrepeat, вот так
C++
1
2
3
4
5
6
7
8
9
10
11
typedef int m10x10[10][10];
class matrix
{
private:
    int m[10][10][10];
public:
    m10x10 &operator[](const unsigned i)
    {
        return m[i];
    }
};
1
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 19:38  [ТС] #9
vxg, а как все тоже самое сделать без typedef?
0
DrOffset
7517 / 4513 / 1024
Регистрация: 30.01.2014
Сообщений: 7,362
14.08.2016, 19:57 #10
Цитата Сообщение от isrepeat Посмотреть сообщение
а как все тоже самое сделать без typedef?
C++
1
2
3
4
5
6
7
8
9
10
class matrix
{
private:
    int m[10][10][10];
public:
    int (&operator[](const unsigned i))[10][10]
    {
        return m[i];
    }
};
2
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 20:01  [ТС] #11
Объясните если не трудно как понять что тут происходит:
C++
1
2
3
4
int (&operator[](const unsigned i))[10][10]
{
      return m[i];
}
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,846
14.08.2016, 20:05 #12
isrepeat, возврат ссылки на int[10][10]
0
DrOffset
7517 / 4513 / 1024
Регистрация: 30.01.2014
Сообщений: 7,362
14.08.2016, 20:09 #13
Цитата Сообщение от isrepeat Посмотреть сообщение
Объясните если не трудно как понять что тут происходит
Вот здесь очень подробно и с примерами: http://unixwiz.net/techtips/reading-cdecl.html
2
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 20:11  [ТС] #14
Я просто первый раз такое вижу, когда после параметров метода(или функции) идет еще что-то ([10][10]).
А об этом можно где то прочитать подробнее?
0
Max Dark
14.08.2016, 20:17     Перегрузка многомерной индексации
  #15

Не по теме:

Цитата Сообщение от isrepeat Посмотреть сообщение
Объясните если не трудно как понять что тут происходит
Статейка по теме

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2016, 20:17
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
14.08.2016, 20:17
Ответ Создать тему
Опции темы

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