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

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

Войти
Регистрация
Восстановить пароль
 
Haklag
9 / 9 / 0
Регистрация: 21.06.2012
Сообщений: 74
Завершенные тесты: 1
#1

Возможно ли для класса сделать оператор "[][]"? - C++

18.02.2014, 16:02. Просмотров 208. Ответов 5
Метки нет (Все метки)

Вообщем вопрос можно ли сделать для класса оператор [][];
Пример для наглядности element[10][10];
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2014, 16:02     Возможно ли для класса сделать оператор "[][]"?
Посмотрите здесь:

Массив: Подсчет матрицы 3x3 по средствам класса используя оператор ">>" - C++
Здравствуйте! Помогите плз разобраться... У меня было задание в универе создать прогу подсчета матрицы 3x3 по средствам класса используя...

Перегрузка "opеrator =" и "{ }" для собственного класса - C++
Я пытаюсь создать класс Vector. Для задания элементов вектора хотелось бы использовать "opеrator =" и " { } ". Возможно ли...

Ошибка экземпляра класса: отсутствие ";" перед идентификатором "o_scenes_1" - C++
В программе есть два класса, для каждого создано по одному экземпляру. Почему-то в месте создания каждого из экземпляров выдает ошибку: ...

"Порядковый номер" для каждого экземпляра класса? - C++
Добрый вечер! Кто знает C++. Подскажите пожалуйста, сейчас застрял на задаче, где нужно создать "порядковый номер" для каждого...

Перегрузка операторов (==, <<, >>, +) для класса "Денежная сумма" - C++
Реализовать класс «Денежная сумма». Данные класса: размер суммы, код валюты, курс по отношению к доллару. Операции: сложение двух сумм,...

Написание дружественного оператора >> для Класса "Wine" с private родителем - C++
Изучаю С++ по Прате. В задание столкнулся с проблемой написания дружественного оператора&gt;&gt; для Класса &quot;Wine&quot; с private родителем ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
18.02.2014, 16:45     Возможно ли для класса сделать оператор "[][]"? #2
Нельзя. Можно сделать оператор [], возвращающий промежуточный объект, у которого тоже есть оператор []. Это даст желаемый эффект.
Haklag
9 / 9 / 0
Регистрация: 21.06.2012
Сообщений: 74
Завершенные тесты: 1
18.02.2014, 16:48  [ТС]     Возможно ли для класса сделать оператор "[][]"? #3
можно пример в коде
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
18.02.2014, 16:55     Возможно ли для класса сделать оператор "[][]"? #4
C++
1
2
3
4
5
6
7
8
class vector{
public: 
  int& operator[](int index);
};
class matrix{
public:
  vector& operator[](int index);
};
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
18.02.2014, 16:55     Возможно ли для класса сделать оператор "[][]"? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#ifndef __MATRIX_H__
#define __MATRIX_H__
 
#include <stdexcept>
#include <cassert>
 
template <class T>
class Matrix
{
    T*           data;
    unsigned int rows;
    unsigned int cols;
 
    T* new_copy(const T* src, size_t src_size, size_t dst_size)
    {
        assert(dst_size >= src_size);
        T* dest = new T[dst_size];
        try
        {
            std::copy(src, src + src_size, dest);
        }
        catch(...)
        {
            delete[] dest;
            throw;
        }
        return dest;
    }
 
public:
    Matrix(unsigned int _rows, unsigned int _cols):
        rows(_rows),
        cols(_cols)
    {
        assert(rows > 0);
        assert(cols > 0);
        if (rows == 0 || cols == 0)
            throw std::invalid_argument("Invalid argument in Matrix ctor");
 
        data = new T[rows * cols];
    }
 
    ~Matrix()
    {
        delete[] data;
    }
 
    Matrix(const Matrix& m):
        data(new_copy(m.data, m.rows * m.cols, m.rows * m.cols)),
        rows(m.rows),
        cols(m.cols)
    {
    }
 
    Matrix& operator=(const Matrix& m)
    {
        if (this != &m)
        {
            T* temp = new_copy(m.data, m.rows * m.cols, m.rows * m.cols);
            delete[] data;
            data = temp;
            rows = m.rows;
            cols = m.cols;
        }
        return *this;
    }
 
    // это позволит обращаться к матрице: m[i][k] = ...;
    template<class U>
    class Helper
    {
        template<typename U> class Matrix;
 
        Matrix<U>&   matrix;
        unsigned int i;
 
        Helper(Matrix<U>& _mc, unsigned int _i): matrix(_mc), i(_i) {};
        Helper(const Matrix<U>& _mc, unsigned int _i): matrix(const_cast<Matrix&>(_mc)), i(_i) {};
        Helper(const Helper&);
        Helper& operator=(const Helper&);
 
        friend class Matrix<U>;
 
    public:
        U& operator[](unsigned int k) const
        {
            assert(i < matrix.rows);
            assert(k < matrix.cols);
            if (i >= matrix.rows || k >= matrix.cols)
                throw std::range_error("Range error in Matrix::Helper::operator[]() const");
 
            return matrix.data[matrix.cols * i + k];
        }
 
        U& operator[](unsigned int k)
        {
            assert(i < matrix.rows);
            assert(k < matrix.cols);
            if (i >= matrix.rows || k >= matrix.cols)
                throw std::range_error("Range error in Matrix::Helper::operator[]()");
 
            return matrix.data[matrix.cols * i + k];
        }
    };
 
    Helper<T> operator[](unsigned int i) const
    {
        assert(i < rows);
        if (i >= rows)
            throw std::range_error("Range error in Matrix::operator[]() const");
 
        return Helper<T>(*this, i);
    }
 
    Helper<T> operator[](unsigned int i)
    {
        assert(i < rows);
        if (i >= rows)
            throw std::range_error("Range error in Matrix::operator[]()");
 
        return Helper<T>(*this, i);
    }
 
    // ... прочие детали интерфейса и реализации....
};
 
#endif //__MATRIX_H__
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2014, 17:01     Возможно ли для класса сделать оператор "[][]"?
Еще ссылки по теме:

Написать шаблон для класса "Рабочий" - C++
Всем доброго время суток! У меня возникла следующая проблема. Препод дал задание: написать шаблон для класса &quot;Рабочий&quot; с полями имени,...

Для класса "R" не существует конструктор по умолчанию - C++
Подскажите, что не так. И как здесь пользоваться cout? Чтобы вывести с. Просто я вбивал, а он не работает. И где его вообще вбивать нужно? ...

На основе заданных прототипов реализовать функции-члены для пользовательского класса "Односвязный список" - C++
Извиняюсь,забыла принт опреедлить Преподаватель дал прототипы функций ,которые надо определить для односвязного списка,но,начав...

Как сделать блок-схему для "do while" - C++
#include &lt;string.h&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; void myFunc(char *st) { int...


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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
18.02.2014, 17:01     Возможно ли для класса сделать оператор "[][]"? #6
Пример не практический, потому что дублирует доступ к простому массиву, но как иллюстрация должен быть вполне очевиден.
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 MyClass {
public:
    class Indexer {  // Сам индексатор, отвечающий за вторые скобки
    public:
        Indexer(MyClass& mc_, size_t index1_):
            mc(mc_),  // Запоминаем в индексаторе ссылку на родительский объект
            index1(index1_)  // и номер строки
        {}
         int& operator [] (size_t index2) {return mc.data[index1][index2];}
    private:
        MyClass& mc;
        const size_t index1;
    };
    friend class Indexer;   // Дадим ему доступ к внутренностям MyClass
 
    Indexer operator [] (size_t index1) {return Indexer(*this, index1);}  // Первые скобки
 
private:
    int data[20][20];
};
 
int main()
{
    MyClass x;
    x[3][4] = 5;  // Всю "шелуху" выкинет оптимизатор и эта операция будет скомпилирована в эквивалент x.data[3][4] = 5;
}
Yandex
Объявления
18.02.2014, 17:01     Возможно ли для класса сделать оператор "[][]"?
Ответ Создать тему
Опции темы

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