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

Реализация механизма обращения к двумерному массиву - C++

Восстановить пароль Регистрация
 
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.07.2014, 17:22     Реализация механизма обращения к двумерному массиву #1
Приветствую участников форума. Есть у нас класс с указателем какого-то типа. Мы выделяем память под массив размера N. При этом мы можем, при помощи адресной арифметики, обращаться к нему как к многомерному массиву. Мой вопрос заключается в том, можно ли реализовать оператор [] так, что бы, обращаться к объекту можно было бы так:
C++
1
2
3
Array<int> a(25);
a[10] = 5;
a[4][4] = 5;
Т.е. одновременно мы можем обращаться как к одномерному массиву, так и к двумерному. Можно ли реализовать такие перегрузки оператора []? Или может как-нибудь через состояния реализовать?
Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2014, 17:22     Реализация механизма обращения к двумерному массиву
Посмотрите здесь:

Реализация механизма замещения страниц в ОП C++
Подключении механизма обнаружение утечек памяти C++
C++ С помощью механизма перегрузки функций реализовать функции для вывода на экран
C++ Нужен урок по одномерном и двумерному динамическому массиву
C++ обращения к указателям
Не получается присвоить значение двумерному массиву char C++
C++ Можно ли значения двумерного динамического массива присвоить обыкновенному двумерному массиву?
Матрицы (обращение к двумерному массиву) C++
C++ Создать класс-шаблон, откладывающий выделение динамической памяти до первого реального обращения к массиву
C++ Как присвоить двумерному символьному массиву значение?
C++ Присваивание элементов двумерного массива другому двумерному массиву
Использование свойства полиморфизма и исследование механизма виртуальных функций C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
06.07.2014, 20:14     Реализация механизма обращения к двумерному массиву #2
Цитата Сообщение от iRomul Посмотреть сообщение
Можно ли реализовать такие перегрузки оператора []?
Можно ввести промежуточный объект, который будет возвращаться operator [], который будет также иметь operator [] и operator =, но проще реализовать индексацию с помощью operator ().

Добавлено через 1 час 57 минут
Вот пример, возможно не всё корректно, то суть должна быть понятна:
Кликните здесь для просмотра всего текста
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
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <functional>
#include <algorithm>
#include <utility>
#include <memory>
#include <cstddef>
#include <cassert>
 
 
template<typename T>
struct matrix {
 
   template<typename V>
   struct index_proxy {
    
      V & operator [](std::size_t const j) const {
         assert(index < ref.height());
         assert(j < ref.width());
         
         return ref.data()[ref.width() * index + j];
      }
      
      operator V &() const {
        assert(index < ref.size());
        
        return ref.data()[index];
      }
      
      template<typename S>
      void operator =(S && value) {
         assert(index < ref.size());
         
         ref.data()[index] = std::forward<S>(value);
      }
    
   private:
      friend class matrix;
   
      index_proxy(matrix & ref, std::size_t const index) : ref(ref), index(index) {}
      
      index_proxy(index_proxy const&) = delete;
      index_proxy(index_proxy &&) = delete;
  
      matrix &          ref;
      std::size_t const index;
   };
   
   
   matrix(std::size_t const height_, std::size_t const width_)
       : data_(new T[height_ * width_])
       , height_(height_)
       , width_(width_)
       {}
   
   matrix(matrix const& other) : matrix(other.height(), other.width()) {
      std::copy_n(other.data(), size(), data());
   }
   
   matrix(matrix && other)
       : data_(std::move(other.data_))
       , height_(other.height_)
       , width_(other.width_)
       {}
       
  matrix & operator =(matrix const& other) {
      height_ = other.height();
      width_  = other.width();
      
      if (size() != other.size()) {
         data().reset(new T[height() * width()]);
      }
      
      std::copy_n(other.data(), size(), data());
      
      return *this;
   }
   
    matrix & operator =(matrix && other) {
      data_   = std::move(other.data_);
      height_ = other.height_;
      width_  = other.width_;
      
      return *this;
   }
   
   
   index_proxy<T> operator [](std::size_t const index) {
      return {*this, index};
   }
   index_proxy<T const> operator [](std::size_t const index) const {
      return {*this, index};
   }
   
   
   std::size_t height() const {
      return height_;
   }
   
   std::size_t width() const {
      return width_;
   }
   
   std::size_t size() const {
      return height() * width();
   }
   
   T * data() {
      return data_.get();
   }
   T const* data() const {
      return data_.get();
   }
   
   
private:
   std::unique_ptr<T[]> data_;
   std::size_t          height_;
   std::size_t          width_;
};
 
 
int main() {
   matrix<int> m(3, 4);
   
   for (std::size_t i = 0; i != m.size(); ++i) {
      m[i] = static_cast<int>(i);
   }
   
   for (std::size_t i = 0; i != m.size(); ++i) {
      std::cout << m[i] << ' ';
   }
   std::cout << std::endl;
   
   for (std::size_t i = 0; i != m.height(); ++i) {
      for (std::size_t j = 0; j != m.width(); ++j) {
         std::cout << m[i][j] << ' ';
      }
      std::cout << std::endl;
   }
}
http://ideone.com/LxIDrE
Yandex
Объявления
06.07.2014, 20:14     Реализация механизма обращения к двумерному массиву
Ответ Создать тему
Опции темы

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