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

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

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

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

06.07.2014, 17:22. Просмотров 313. Ответов 1
Метки нет (Все метки)

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

Матрицы (обращение к двумерному массиву) - C++
Народ, решил на досуге для собственного использования создать класс матрица( пока пробный). Разумеется захотелось обращаться как к...

Не получается присвоить значение двумерному массиву char - C++
объявляю двумерный массив (массив массивов в char для хранения имен файлов) в cpp файле char m_fname ; я хочу инициализировать...

Как присвоить двумерному символьному массиву значение? - C++
Проблема в строке 18. Как будет правильно? #include &lt;cstdio&gt; int main() { char buf; int i,j,N,time,t,k,buftime,m; ...

Нужен урок по одномерном и двумерному динамическому массиву - C++
Нужен урок по одномерном и двумерному динамическому массиву

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

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

1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2014, 20:14
Привет! Вот еще темы с ответами:

Реализация механизма замещения страниц в ОП - 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), которая определяет произведение элементов квадратной...


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

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

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