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

Как правильней делать матрицу-объект? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ программа которая запрашивает ввод чисел http://www.cyberforum.ru/cpp-beginners/thread667422.html
Напишить программу, которая запрашивает ввод чисел. После каждого ввода числа на экран выводится сумма введенных до сих пор чисел. Программа завершается вводом 0.
C++ Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Х[нач] до Х[кон] с шагом dx Задание из учебника Т. А. Павловской "C/C++. Программирование на языке высокого уровня" По возможности написать решение полностью. Благодарю Очень прошу помочь. Заранее огромное спасибо! http://www.cyberforum.ru/cpp-beginners/thread667421.html
C++ Статические массивы: вычислить произведение матрици на вектор и максимальный элемент полученого вектора
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Сделать с помощью статического массива. Вычислить произведение матрици на вектор и максимальный элемент полученого вектора.
Вычислить периметр и площать прямоугольного треугольника по длинам 2-х катетов C++
Создать линейную программу для решения след. задачи. Вычислить периметр и площать прямоугольного треугольника по длинам 2-х катетов //Zadacha1 #include <iostream.h> #include <math.h> void main() {float a,b,g,P,S; cout <<"a="; cin >>a; cout <<"b="; cin >>b; g=Sqrt(a*a+b*b)+a+b;
C++ матричный шифр обхода http://www.cyberforum.ru/cpp-beginners/thread667401.html
Помогите реализировать матричный шифр обхода.
C++ Определите, принадлежит ли точка данной окружности Нужно побыстрому задачу на С решить! Заранее спасибо! Окружность с центром в точке (x,y) проходит через точку (x1,y1). Определите, принадлежит ли точка (x2,y2) данной окружности. Добавлено через 30 секунд Ауу есть кто? подробнее

Показать сообщение отдельно
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.10.2012, 21:39     Как правильней делать матрицу-объект?
Вот если в кратце то так:
Завести класс строк, класс ссылок на строк и класс матрицы.
матрица будет возвращать ссылочные строки, которые не позволяют изменять реальные строки, на которые они ссылаются. этим самым будет невозможен такой код: m[i].resize();
При этом снабдить всех правильными конструкторами и операторами =, чтобы были проверки и работало согласно требованиям.
Вот в быстренькое решение на коленке со своими проблемами . неконстантность оператора [], нужно следить за протуханием ссылочных строк и прочее. но для точки отсчета должно пригодится:

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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <vector>
 
template <typename T>
class Row;
 
template <typename T>
class RowRef;
 
 
template <typename T>
class Row
{
public:
  Row()
  {
  }
 
  Row(const RowRef<T>& rowRef);
  Row& operator = (const RowRef<T>& rowRef);
 
  const T& operator [] (unsigned index) const
  {
    return m_data[index];
  }
 
  T& operator [] (unsigned index) 
  {
    return m_data[index];
  }
 
  unsigned getSize() const
  {
    return static_cast<unsigned>(m_data.size());
  }
 
  void resize(unsigned size)
  {
    // тут нужна более умная реализация, позволяющая уменьшать размеры
    // и сохраняющая или не сохраняющая уже имеющиеся данные.
    m_data.resize(size);
  }
 
private:
  std::vector<T> m_data;
};
 
 
template <typename T>
class RowRef
{
public:
  explicit RowRef(Row<T>& row)
    : m_row(&row)
  {
  }
 
  RowRef& operator = (const Row<T>& row)
  {
    if (m_row->getSize() == row.getSize())
    {
      *m_row = row;
    }
    return *this;
  }
 
  const T& operator [] (unsigned index) const
  {
    return (*m_row)[index];
  }
 
  T& operator [] (unsigned index) 
  {
    return (*m_row)[index];
  }
 
  unsigned getSize() const
  {
    return m_row->getSize();
  }
 
private:
  Row<T>* m_row;
};
 
 
template <typename T>
Row<T>::Row(const RowRef<T>& rowRef)
  : m_data(&rowRef[0], &rowRef[0] + rowRef.getSize())
{
}
 
template <typename T>
Row<T>& Row<T>::operator = (const RowRef<T>& rowRef)
{
  m_data.assign(&rowRef[0], &rowRef[0] + rowRef.getSize());
  return this;
}
 
 
template <typename T>
class Matrix
{
public:
  // Проблема. С помощью возвращенной ссылки можно поменять строку. Нужно возвращать что-то, через что это сделать нельзя.
  RowRef<T> operator [] (unsigned index) const
  {
    return RowRef(m_rows[index]);
  }
 
  RowRef<T> operator [] (unsigned index) 
  {
    return RowRef<T>(m_rows[index]);
  }
 
  void resize(unsigned rows, unsigned columns)
  {
    // тут нужна более умная реализация, позволяющая уменьшать размеры
    // и сохраняющая или не сохраняющая уже имеющиеся данные.
    m_rows.resize(rows);
    for (std::vector< Row<T> >::iterator it = m_rows.begin(), end = m_rows.end(); it != end; ++it)
    {
      it->resize(columns);
    }
  }
 
  unsigned getRows() const
  {
    return m_rows.size();
  }
 
  unsigned getColumns() const
  {
    return m_rows.empty() ? 0 : m_rows[0].getSize();
  }
 
private:
  std::vector< Row<T> > m_rows;
};
 
 
 
int main()
{
  Matrix<int> m;
  m.resize(5, 5);
  m[1][1] = 10;
//  m[1].resize(10); // это не компилится. потому что возвращается RowRef у которого нет метода ресайза
  Row<int> r = m[1]; // ok. у Row есть конструктор, который принимает RowRef и копирует в себя все данные из ссылочной строки.
  m[1] = r; // RowRef имеет оператор =, который копирует из r данные если размеры строк совпадают.
  r.resize(10); // это можно ресайзить, потому что это копия строки из матрицы. все изменения с этой строкой не влияют на размеры и значения исходной матрицы
  m[1] = r; // не пройдет. разные размеры у матричной строки и у этой копии.
 
  return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru