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

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

Войти
Регистрация
Восстановить пароль
 
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
#1

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

06.07.2014, 17:22. Просмотров 309. Ответов 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++
Проблема в строке 18. Как будет правильно? #include &lt;cstdio&gt; int main() { char buf; int i,j,N,time,t,k,buftime,m; ...

Присваивание элементов двумерного массива другому двумерному массиву - C++
нужно элементы одного двумерного массива присвоить другому. Вот программа. Но для одномерного массива она работает, если соответственно...

Можно ли значения двумерного динамического массива присвоить обыкновенному двумерному массиву? - C++
Столкнулся с проблемой с динамическими массивами, можно ли значения двумерного динамического массива присвоить обыкновенному двумерному...

Реализация механизма замещения страниц в ОП - C++
Необходимо реализовать модель «реализация механизма замещения страниц в ОП». Существует список из N активных страниц (по желанию можно...

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

Подключении механизма обнаружение утечек памяти - C++
// output N number of M devide L.cpp : Defines the entry point for the console application. // #include &quot;stdafx.h&quot; #include...

Использование свойства полиморфизма и исследование механизма виртуальных функций - C++
Создайте класс Matr, определите в нем виртуальную функцию-член matrica(int n), которая определяет произведение элементов квадратной...

обращения к указателям - C++
Написать обращения к указателям в глобальной,локальной и охватывающей сетях.


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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
Ответ Создать тему
Опции темы

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