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

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

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

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

17.05.2011, 22:51. Просмотров 3476. Ответов 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;
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2011, 22:51     Перегрузка операторов для класса матриц
Посмотрите здесь:

C++ Перегрузка операторов для класса треугольника
Сложение и вычитание матриц. Перегрузка операторов. C++
Перегрузка операторов для класса МАССИВ C++
C++ Перегрузка операторов для класса
Перегрузка операторов для класса "множество целых чисел" C++
C++ Ошибка в классе матриц (перегрузка операторов)
C++ Класс "Дроби" и перегрузка операторов для этого класса
Перегрузка операторов для класса "Матрица" C++
Перегрузка операторов для класса polynom C++
Перегрузка операторов класса String C++
C++ Перегрузка операторов ==, !=, <, > для класса "Дробь"
C++ Перегрузка операторов + матриц - C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
18.05.2011, 00:08     Перегрузка операторов для класса матриц #2
в конструкторе копирования не надо удалять переменную класса. Это КОНСТРУКТОР. Во время его исполнения в классе еще ничего нет. Надо только определять.
le_bon_garcon
0 / 0 / 0
Регистрация: 17.05.2011
Сообщений: 3
08.06.2011, 19:50  [ТС]     Перегрузка операторов для класса матриц #3
Мерси!



Разобрался. Тема закрыта.
Yandex
Объявления
08.06.2011, 19:50     Перегрузка операторов для класса матриц
Ответ Создать тему
Опции темы

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