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

C++

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

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

14.08.2016, 05:43. Просмотров 676. Ответов 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];
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
14.08.2016, 10:29     Перегрузка многомерной индексации #2
isrepeat, наверное перегрузить [] что бы возвращал объект-матрицу у которой перегружен [] что бы возвращал объект-ряд у которого перегружен [] что бы возвращал элемент
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 ?
Max Dark
шКодер самоучка
1656 / 1457 / 527
Регистрация: 09.10.2013
Сообщений: 3,314
Записей в блоге: 8
Завершенные тесты: 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
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 17:34  [ТС]     Перегрузка многомерной индексации #5
Cra3y, использовать дополнительные фигурные скобки не хочется. хочется так как в последнем main.
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
14.08.2016, 19:02     Перегрузка многомерной индексации #6
isrepeat, путь я вам сказал

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

Добавлено через 2 минуты
В принципе можете перегрузить только [] на возврат int **
Не, так не пойдет. Будь даже у нас n-мерный массив он все равно является одним указателем(в отличии от динамического).
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
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];
    }
};
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 19:38  [ТС]     Перегрузка многомерной индексации #9
vxg, а как все тоже самое сделать без typedef?
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
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];
    }
};
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];
}
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
14.08.2016, 20:05     Перегрузка многомерной индексации #12
isrepeat, возврат ссылки на int[10][10]
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
14.08.2016, 20:09     Перегрузка многомерной индексации #13
Цитата Сообщение от isrepeat Посмотреть сообщение
Объясните если не трудно как понять что тут происходит
Вот здесь очень подробно и с примерами: http://unixwiz.net/techtips/reading-cdecl.html
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 20:11  [ТС]     Перегрузка многомерной индексации #14
Я просто первый раз такое вижу, когда после параметров метода(или функции) идет еще что-то ([10][10]).
А об этом можно где то прочитать подробнее?
Max Dark
14.08.2016, 20:17
  #15

Не по теме:

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

isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 20:27  [ТС]     Перегрузка многомерной индексации #16
Cra3y, еще как по теме +
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
14.08.2016, 20:29     Перегрузка многомерной индексации #17
isrepeat, это, кстати, перевод той же статьи, что я выше дал.
isrepeat
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 11
14.08.2016, 22:58  [ТС]     Перегрузка многомерной индексации #18
да, я знаю, просто я не настолько хорошо знаю английский чтобы свободно читать. а русская статья как не есть кстати.

Добавлено через 2 часа 22 минуты
Спасибо всем, думаю проблема решена.
HighPredator
5453 / 1819 / 334
Регистрация: 10.12.2010
Сообщений: 5,380
Записей в блоге: 3
16.08.2016, 09:33     Перегрузка многомерной индексации #19
Вот были хорошие обсуждения по теме:
Перегрузка оператора индексации
Перегрузка двойного индексного оператора
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 13:44     Перегрузка многомерной индексации
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Avazart
7062 / 5239 / 261
Регистрация: 10.12.2010
Сообщений: 23,037
Записей в блоге: 17
19.08.2016, 13:44     Перегрузка многомерной индексации #20
Цитата Сообщение от isrepeat Посмотреть сообщение
ra3y, использовать дополнительные фигурные скобки не хочется. хочется так как в последнем
main.
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
39
40
#include <iostream>
#include <vector>
 
class Row
{
    public:
       Row(std::size_t size=0)
         :cols_(size){};
         
       int& operator[](int index) { return cols_[index]; } 
       const int& operator[](int index)  const { return cols_[index]; } 
    private:
       std::vector<int> cols_; // или std::array<> или просто обычный массив.
};
 
class Matrix
{
    public:
      Matrix(std::size_t rowSize, std::size_t colSize) 
        :rows_(rowSize, Row(colSize) ){}
      
      Row& operator[](int index) { return rows_[index]; } 
      const Row& operator[](int index)const { return rows_[index]; } 
        
    private:
      std::size_t colSize_;
      std::vector<Row> rows_;
};
 
 
int main() 
{
    Matrix  m(3,4);
    
    m[2][2]= 5;
    
    std::cout<< m[2][2] << std::endl;
 
    return 0;
}
http://ideone.com/0beYw8
Yandex
Объявления
19.08.2016, 13:44     Перегрузка многомерной индексации
Ответ Создать тему
Опции темы

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