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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
le_bon_garcon
0 / 0 / 0
Регистрация: 17.05.2011
Сообщений: 3
#1

Перегрузка операторов для класса матриц - C++

17.05.2011, 22:51. Просмотров 3687. Ответов 2
Метки нет (Все метки)

Собственно, суть проблемы. Пишу класс матриц (хочется), оператор присваивания работает только тогда, когда функция (ну или, например, оператор +) возвращает *this и тип возвращаемого значения - ссылка. Иначе, выдаёт:

a.out(1181) malloc: *** error for object 0x7fff5fbffa40: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap

Конструктор копирования работает всегда. Почему так происходит?
Заранее спасибо.

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
155
#include<stdio.h>
#include<math.h>
class tmatrix
{
  private:
  double *x;
  int n;
 
  public:
 
//конструкторы
 
  tmatrix() {n=0; x=NULL;};
    
    tmatrix(int _n)
    {
        if (_n>0)
        {
        n=_n;
        x=new double[n * n];
        }
        else printf("** error: matrix's dimension is incorrect (%i) **\n",_n);
    };
    
  tmatrix (const tmatrix &_C)
  {
      if (x != NULL) 
      {
          delete []x; 
          x=NULL;
      }
      
      n=_C.n;
      x=new double[ n * n ];
      for (int i=0;i< n * n;i++) 
      {
          x[i]=_C.x[i];
      } ;
  };
    
    ~tmatrix()
    {   
        if (x!=NULL)
        {
            delete []x;
            x=NULL;
        }
       n=0;    
    };
 
void scan(); //читает матрицу с клавы, работает нормально
void print(); // печатает матрицу
 
double& operator[](int _i) {return x[ _i ];};
 
 
    int operator != (tmatrix C)
    {
        if (n!=C.n) {return 1;}
        else
        {
            for(int i=0; i<n;i++)
            {
                for(int k=0; k<n;k++)
                {
                 if ( x[i * n + k] != C[i * n + k] ) {return 1;}
                }
            }
        }
        return 0;
        
    };
 
    
    tmatrix& operator = (const tmatrix &C)
    { 
            delete [] x;            
            n=C.n;
            x=new double[ n * n ];
        
            for (int i=0;i< n * n;i++) 
            {
                x[i] = C.x[i];
            }  
            return *(this); 
        
    };
    
 
    tmatrix& operator += (const tmatrix &C)
    {
        if (n != C.n)
        {
            printf(" ** error: Matrices' dimension for operator '+=' is incorrect ** ");
        }
        else     
        {
            for(int i=0; i<n;i++)
            {
                for(int k=0; k<n;k++)
                {
                    x[i * n + k] += C.x[i * n + k];
                }
            }    
        }
        return *this;
    };
    
 
    tmatrix operator + (const tmatrix &C)
    {
        if (n != C.n)
        {
            printf(" ** error: Matrices' dimension for operator '+' is incorrect ** ");
        }
        else     
        {
            tmatrix temp = *this;
            temp += C; 
            return temp;
        }
        
    };
 
int main()
{       
    tmatrix A(2);  
    A.scan();
   
    
    tmatrix B(2);
    B.scan();
    
    printf(" <B> \n");
    B.print();
    printf(" <A> \n");
    A.print();
    
    B += A;
    printf(" <B+=A> \n");
    B.print();
    tmatrix D= A+B;
    D.print();
    //Это работает
    
 
 
    tmatrix C;
    C = A + B;
    printf(" <C = A + B :> \n");
    C.print();
    //вылазит ошибка
 
return 0;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2011, 22:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов для класса матриц (C++):

Перегрузка операторов для класса - C++
class A { private: size_t i; public: size_t i_get() { return i; } };

Перегрузка операторов для класса МАССИВ - C++
Привет. Есть класс &quot;вектор&quot; (&quot;массив&quot;), нужно переопределить операторы =, +, - , *, +=, -=, *= с целым числом. =, +=, -=, *=, как...

Перегрузка операторов для класса треугольника - C++
Дан класс Треугольник, включающий в себя закрытые поля для сторон и медиан. Указать все необходимые функции инициализации и доступа к...

Перегрузка операторов для класса Треугольник - C++
Задание: Перегрузить операторы &gt;, &lt;, == для класса Треугольник относительно сравнения площадей объектов данного класса. Сделать то же...

Перегрузка операторов для класса polynom - C++
Создаю класс полиномов (polynom), в нём надо перегрузить ряд операторов. Где-то нашёл пример, где оператор сложения перегружается так: ...

Перегрузка операторов + матриц - C++ - C++
Задание : определить класс «Квадратная матрица» - Matrix. Класс должен иметь несколько конструкторов, у том числе конструктор копирования. ...

2
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
18.05.2011, 00:08 #2
в конструкторе копирования не надо удалять переменную класса. Это КОНСТРУКТОР. Во время его исполнения в классе еще ничего нет. Надо только определять.
0
le_bon_garcon
0 / 0 / 0
Регистрация: 17.05.2011
Сообщений: 3
08.06.2011, 19:50  [ТС] #3
Мерси!



Разобрался. Тема закрыта.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2011, 19:50
Привет! Вот еще темы с ответами:

Ошибка в классе матриц (перегрузка операторов) - C++
уважаемые форумчане, помогите, пожалуйста, найти ошибку в коде пишу класс на матрицы довольно объемный по содержанию, во всяком случае...

Сложение и вычитание матриц. Перегрузка операторов. - C++
Добрый день)) посмотрите пожалуйста на мой код и помогите, если не сложно) #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace...

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

Перегрузка операторов для класса "множество целых чисел" - C++
Собственно, в этом и вопрос. Как перегрузить операторы &quot;+&quot; и &quot;-&quot; для объединение и разности двух множеств?


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

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

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