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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
maks_b1
1 / 1 / 0
Регистрация: 26.11.2011
Сообщений: 29
#1

Класс "Матрица": конструктор, деструктор и перегрузка операторов - C++

20.12.2011, 22:02. Просмотров 4715. Ответов 22
Метки нет (Все метки)

Матрица – KMatrix
Методы:
конструкторы, деструктор;
операции: [], =, ==, !=, +, +=, –, –=, *, *=, <<, >>
функции:
Transpose – транспонирование матрицы,
Rows() – количество строк,
Cols() – количество колонок,
Swap() - обменять значения (т.е. матрицы).
Примечание:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 22:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс "Матрица": конструктор, деструктор и перегрузка операторов (C++):

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

Перегрузка операторов для класса "Матрица" - C++
Доброго времени суток. Помогите довести до ума код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;math.h&quot;...

Класс "Дроби" и перегрузка операторов для этого класса - C++
Всем Доброго времени суток. Есть учебная задача по условиям которой необходимо реализовать класс &quot;Дроби&quot; и перегрузку операторов для...

Класс "Матрица". Перегрузка оператора "минус" - C++
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс матрицы, используя двухмерный динамический...

Класс "динамический массив", перегрузка операторов +, = - C++
Делаю класс динамического массива. Перегружая при этом операторы. На данный момент банально не могу перегрузить + и =. Visual Studio...

Класс "Прямая". Перегрузка операторов - C++
Очень нужна ваша помощь, скоро сдавать лабораторную, а у меня затруднения.. Не могу сделать.. Тема: Перегрузка операций Класс:...

22
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 11:50 #16
dimcoder, считайте меня датошным.. но!
ваша функция
C++
1
2
3
4
5
6
float* matrix::operator[](int nk) const
{
   if (nk > n-1)
      cout << "Error: array overflow..." << endl;
   return mPtr[nk];
}
корректна только для квадратной матрицы.
а как быть если количество колонок и строк разное?
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 12:06 #17
Вы имеете ввиду проверку на выход за границы? Здесь да, но в 7-едьмом сообщении я исправил эту ошибку (46-строка).
Цитата Сообщение от greeezz Посмотреть сообщение
корректна только для квадратной матрицы.
О_о Отожгли... ЛайвВоркСпэйс вам в помощь:
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
#include <iostream>
using namespace std;
 
class matrix
{
   public:
 
   matrix(int, int, int = 0);
   ~matrix();
 
   float*& operator[](int) const;
 
   void operator*=(matrix& b);
   void operator/=(matrix& b);
 
 
   private:
 
   float **mPtr;
 
   int n;
 
   int m;
};
 
matrix::matrix(int nk, int mk, int init)
{
   //**mPtr = new (float[nk])[mk];
   mPtr = new float*[nk];
   for (int x = 0; x < nk; x++)
      mPtr[x] = new float[6];
 
   n = nk;
 
   m = mk;
 
   for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
    mPtr[i][j] = init;
}
 
matrix::~matrix ()
{
   delete [] mPtr;
}
 
float*& matrix::operator[](int nk) const
{
   if ((nk > n-1) || (nk < 0))
      cout << "Error: array overflow..." << endl;
   return mPtr[nk];
}
 
 
 
 
 
main ()
{
   
 
   matrix m(10, 15); //NE KVAdratnYA MATRICA!
 
   m[4][3] = 32;
 
   cout << m[4][3] << endl;   //RABOTAET!
 
   return 0;
}
0
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 12:30 #18
Цитата Сообщение от dimcoder Посмотреть сообщение
Вы имеете ввиду проверку на выход за границы? Здесь да, но в 7-едьмом сообщении я исправил эту ошибку (46-строка).
из седьмого сообщения:
C++
1
2
3
4
5
6
float*& matrix::operator[](int nk) const
{
   if ((nk > n-1) || (nk < 0))
      cout << "Error: array overflow..." << endl;
   return mPtr[nk];
}
в этой функции вы делаете проверку только на валидность количества колонок. а не строк и колонок. именно по этому я и говорю что будет корректно только для квадратной матрицы. когда nk равно mk

попробуйте
C++
1
2
3
4
5
6
7
8
9
10
11
int main ()
{
 
   matrix m(10, 15); //NE KVAdratnYA MATRICA!
 
   m[4][28] = 32;   // NE RABOTAET!
 
   cout << m[4][28] << endl;   // NE RABOTAET!
 
   return 0;
}
Добавлено через 11 минут
Цитата Сообщение от greeezz Посмотреть сообщение
if ((nk > n-1) || (nk < 0))
еще хотелось бы добавить.
к примеру в вашем объекте m = 10 (строки), n = 5 (колонки), так вот если
a[9][5] - ваше условие вернет ошибку. потому что (nk > n-1) будет истина.

Добавлено через 1 минуту
в свзяи с этим мой вопрос остается открытым. как быть если матрица не квадратная. (кроме той перегруки которую я сделал в самам начале с использование вспомагательного класса.)
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 12:36 #19
Цитата Сообщение от greeezz Посмотреть сообщение
cout << m[4][28] << endl; // NE RABOTAET!
Так я и не спорю. Как не переделывайте функцию
Цитата Сообщение от dimcoder Посмотреть сообщение
float*& matrix::operator[](int nk) const
, проверку не проведёте. Мы получаем доступ к элементу при помощи перегруженного оператора [] типа float и ничего мы с этим не сделаем. Кстати, имхо непроверка на выход за границы это единственный минус.
0
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 20:59 #20
вроде все понял. спасибо большое.
Однако минус того что проверяется только количество строк и нельязя проверить количество колонок мне кажется существенным.
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
28.12.2011, 21:00 #21
Цитата Сообщение от greeezz Посмотреть сообщение
потому что в функции есть проверка только на размер либо строк либо колонок
Там проверка только строк. Как вы сможите проверить валидность номера колонки?!

Цитата Сообщение от greeezz Посмотреть сообщение
главный минус в том что в том случае когда обращение к элементу корректное ваша функция вернет ошибку.
где-где??? В LiveWorkSpace вернёт 32:
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
#include <iostream>
using namespace std;
 
class matrix
{
   public:
 
   matrix(int, int, int = 0);
   ~matrix();
 
   float*& operator[](int) const;
 
   void operator*=(matrix& b);
   void operator/=(matrix& b);
 
 
   private:
 
   float **mPtr;
 
   int n;
 
   int m;
};
 
matrix::matrix(int nk, int mk, int init)
{
   //**mPtr = new (float[nk])[mk];
   mPtr = new float*[nk];
   for (int x = 0; x < nk; x++)
      mPtr[x] = new float[6];
 
   n = nk;
 
   m = mk;
 
   for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
    mPtr[i][j] = init;
}
 
matrix::~matrix ()
{
   delete [] mPtr;
}
 
float*& matrix::operator[](int nk) const
{
   if ((nk > n-1) || (nk < 0))
      cout << "Error: array overflow..." << endl;
   return mPtr[nk];
}
 
 
 
 
 
int main ()
{
   
 
   matrix m(10, 2); //NE KVAdratnYA MATRICA!
 
   m[9][1] = 32;
 
   cout << m[9][1] << endl;   //RABOTAET!
 
   return 0;
}

Здесь смысл прост! Выражение
C++
1
m[9][1] = 32;
сначала преобразуется в
C++
1
<какой-то адрес типа float>[32]
Здесь operator[] вызывается ОДИН РАЗ, воспользуйтесь трассировкой, если не верите!
1
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.12.2011, 21:37 #22
dimcoder, я уже разобрался
я сразу не понял что оператор вызывается только один раз. и потом происходт обращение к элементу грубо говоря вектора.

спасибо вам за дебаты! я узнал для себя много интересных вещей!
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
29.12.2011, 09:09 #23
Цитата Сообщение от greeezz Посмотреть сообщение
спасибо вам
И вам. С наступающим Новым Годом всех.
0
29.12.2011, 09:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2011, 09:09
Привет! Вот еще темы с ответами:

Класс "Дата", перегрузка операторов - C++
Доброго времени суток,многоуважаемые форумчане! Делали лабу, по перегрузке операторов в классе, но в итоге выдает какой-то мусор. ума не...

Класс "Точка", перегрузка операторов - C++
не могу найти где накосячил. тестил только арифметику. при выполнении получаю следующее: # include &lt;iostream&gt; using namespace...

Класс "Матрица", перегрузка оператора "+" - C++
Здравствуйте. Создаю класс матрица, в нём перегружаю оператор &quot;+&quot;. На этапе компиляции всё замечательно, но при запуске программа вылетает....

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...


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

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

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