Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
druidich
30 / 30 / 12
Регистрация: 21.05.2012
Сообщений: 445
1

Перегрузка оператора [][]

20.12.2014, 10:34. Просмотров 357. Ответов 3
Метки нет (Все метки)

добрый день.
имею в классе двумерный массив.
подскажите как правильно сделать перегрузку к классу, чтоб при ЭкземлплярКлассa[i][j] выводилось значение, хранимое в заданной ячейче массива.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2014, 10:34
Ответы с готовыми решениями:

Перегрузка оператора *
Операция произведения применяется к объекту квадрат, при этом изменяются координаты центры фигуры....

Перегрузка оператора ++
Что делает оператор ++ при его перегрузке?

Перегрузка оператора ==
Создайте класс stroka. Класс должен включать поле (массив) типа char для хранения строки. Класс...

Перегрузка оператора ()
Никак не могу разобраться с перерузкой оператора () и в литературе не могу найти доходчивое...

Перегрузка оператора ->
обясните пожалуйста как перегружать -> и для чего это нужно

3
nmcf
6541 / 5763 / 2623
Регистрация: 14.04.2014
Сообщений: 24,498
20.12.2014, 10:35 2
На один класс только одни скобки можно перегрузить.
0
hoggy
Эксперт С++
7713 / 3485 / 722
Регистрация: 15.11.2014
Сообщений: 7,947
Завершенные тесты: 1
20.12.2014, 11:21 3
http://rextester.com/DSN46053

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
//Title of this code
 
#include <iostream>
 
 
struct record
{
    void set(const char* text){ strcpy(ar,text); }
    
   
    char operator[](const size_t i) { return ar[i]; }
    
    char ar[100];
    
    
    template<class T> friend T& 
        operator<<(T& os, const record& obj )
            { return os<< obj.ar; }
};
 
struct sample
{
    sample()
    {
        ar[0].set("hello");
        ar[1].set("world");
        ar[2].set("peace");
        ar[3].set("tlololo");
        ar[4].set("olololo");
    }
    
    record& operator[](const size_t i) { return ar[i]; }
    
    record ar[5];
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    sample test;
    
    std::cout << "first symbol of the word '"<< test[1] << "' is '"<< test[1][0]<< "' and must be 'w'\n";
}
0
DiffEreD
1446 / 783 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
20.12.2014, 12:45 4
Вот как я это делал. Это набросок еще не за конченого класса, но здесь есть то что тебе нужно:
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
template<typename T>
class matrix
{
   T** m_matrix = nullptr;
   size_t m_rows = 0, m_cols = 0;
   size_t m_size = 0;      //m_cols*m_rows
public:
   typedef  T                         value_type;
   typedef  std::size_t               size_type;
   typedef  std::ptrdiff_t            difference_type;
   typedef  value_type&               reference;
   typedef  const value_type&         const_reference;
   typedef  value_type*               pointer;
   typedef  const value_type*         const_pointer;
 
   typedef T*                                      iterator;
   typedef const T*                                const_iterator;
   typedef  std::reverse_iterator<iterator>        reverse_iterator;
   typedef  std::reverse_iterator<const_iterator>  const_reverse_iterator;
 
   iterator         begin()        { return iterator(m_matrix[0]); }
   const_iterator   begin() const  { return const_iterator(m_matrix[0]); }
   const_iterator   cbegin() const { return const_iterator(m_matrix[0]); }
 
   iterator         end()           { return iterator(m_matrix[0]+m_size); }
   const_iterator   end() const     { return const_iterator(m_matrix[0]+m_size); }
   const_iterator   cend() const    { return const_iterator(m_matrix[0]+m_size); }
 
   matrix() = default;
 
   matrix(size_t rows, size_t cols) : m_rows(rows), m_cols(cols), m_size(rows*cols) {
      if (m_size == 0) throw std::logic_error("ZERO SIZE");
      m_matrix = new T*[m_rows];
      m_matrix[0] = new T[m_size];
      for (size_t i = 1; i<m_rows; ++i)
         m_matrix[i] = m_matrix[i-1]+m_cols;
   }
 
   ~matrix() {
      if (m_matrix) {
         delete[] m_matrix[0];
         delete[] m_matrix;
      }
   }
 
   size_type get_rows() const {return m_rows;}
   size_type get_cols() const {return m_cols;}
 
   size_type size() const {return m_rows*m_cols;}
 
   const pointer operator[](size_t index) const {return m_matrix[index];}
   pointer operator[](size_t index) {return m_matrix[index];}
};
 
 
int main()
{
   matrix<int> m(3,4);
   std::iota(m.begin(), m.end(), 1);
   for (size_t i = 0; i < m.get_rows(); ++i)
   {
      for (size_t j = 0; j < m.get_cols(); ++j)
         std::cout << m[i][j] << " ";
      std::cout << "\n";
   }
 
   return 0;
}
Особое внимание обрати как реализовано выделение памяти в конструкторе - все элементы матрицы располагаются в одном блоке памяти.
0
20.12.2014, 12:45
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2014, 12:45

Перегрузка оператора []
Возможно ли создать два перегруженных оператора индексации, чтобы один из них возвращал l-value,...

Перегрузка оператора +
Осуществляю перегрузку оператора +. и вот почему-то член класса s меняет свою длину с 4 до 7 и мне...

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


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

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

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