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

Не работает конструктор копирования - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
10.12.2011, 13:53     Не работает конструктор копирования #1
Пишу свой класс матрица.
В конструкторе копирования вылезла ошибка, решить которую мне не удается.
Отладчиком проходился не один раз, не помогает.

Вот написанный мною код
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
//matrix.h
 
#pragma once
class matrix
{
    double **Matr;
    int size;           //матрица квадратная
public:
    //конструкторы
    matrix(int _N=0);           //умолч + параметр
 
    matrix(const matrix &A);            //копирование
    //деструктор
    ~matrix(void);
 
    //операции
 
    matrix& operator =(const matrix &A);//+
    matrix operator +(const matrix &A);//+
    matrix operator *(const matrix &A);//+
    matrix operator -(const matrix &A);//+
    matrix ObrMatr();//+
    //методы 
    void Show() const;              //вывод матрицы на экран
    void ReadInFile(FILE *f);       //читаем матрицу из файла
    double Element(int i,int j);    //возвращает элемент по заданным координатам
    bool Find(double Item);         //поиск элемента в матрице true - есть, false - нет.  Ищет первое вхождение элемента в матрицу
                                    //i,j - координаты, если эл-т найден. -1,-1 - если не найден.
 
    bool IsDiagonal();              //проверяет, является ли матрица диагональной
    bool IsSimmetr();               //проверяет, является ли матрица симметричной
 
};
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
//matrix.cpp
 
#include "StdAfx.h"
#include "matrix.h"
#include <math.h>
 
 
matrix::matrix(int _N): size(_N)
{
    Matr=new double*[size];
    for (int i=0; i<size; i++)
        Matr[i]=new double[size];
 
    //создаем матрицу и заполняем ее нулями
    for (int i=0; i<size; i++)
        for (int j=0; j<size; j++)
        {
            Matr[i][j]=0;
        }
}
 
 
matrix::~matrix(void)
{
    size=0;
    delete [] *Matr;
}
matrix::matrix(const matrix &A)         
//копирование - тот самый конструктор, который не рапботает
{
    /*Matr=new double*[size];
    for (int i=0; i<size; i++)
        Matr[i]=new double[size];*/
    size=A.size;
    for (int i=0; i<size; i++)
        for (int j=0; j<size; j++)
        {
            Matr[i][j]=A.Matr[i][j];
        }
}
 
matrix& matrix::operator =(const matrix &A)
{
    if(this == &A)
       return *this;
    size=A.size;
    for (int i=0; i<size; i++)
        for (int j=0; j<size; j++)
        {
            Matr[i][j]=A.Matr[i][j];
        }
    return *this;
}
 
matrix matrix::operator +(const matrix &A)
{
    matrix temp(size);
    temp.size=A.size;
    for (int i=0; i<temp.size; i++)
        for (int j=0; j<temp.size; j++)
        {
            temp.Matr[i][j]=Matr[i][j]+A.Matr[i][j];
        }
    return temp;
}
 
matrix matrix::operator -(const matrix &A)
{
    matrix temp(size);
    temp.size=A.size;
    for (int i=0; i<temp.size; i++)
        for (int j=0; j<temp.size; j++)
        {
            temp.Matr[i][j]=Matr[i][j]-A.Matr[i][j];
        }
    return temp;
}
 
matrix matrix::operator *(const matrix &A)
{
    matrix temp(size);
    for (int i=0; i<size; i++) 
        for (int j=0; j<size; j++) 
        {
            for(int k = 0; k < size; k++)
                temp.Matr[i][j] += (Matr[i][k] * A.Matr[k][j]);
        }
    return temp;
}
 
matrix matrix::ObrMatr()
{
    matrix temp(size);
    return temp;
}
 
 
 
double matrix::DetermGauss()
{  // Метод Гауса
//Прямой ход. В результате получим приведённую к треугольному виду матрицу. 
double det=1.0;
matrix temp(size);
temp=*this;
int L=0; //номер строки
//float max_el=0.0;
//int max_el_row;
//float *tmp_address; //указатель на строку массива (при перестановке строк меняем адрес)
double tmpf=0.0, tmpf2=0.0, t3=0.0;
for (int j=0; j<temp.size; j++)
{
for (int k=1+L; k<temp.size; k++)  //! k=1; L=0,1,2...
{
    tmpf=temp.Matr[k][j]/temp.Matr[L][j];
    for (int i=0; i<=temp.size; i++)
    {
        if (fabs(tmpf)==0) break;
        tmpf2=(temp.Matr[L][i]*tmpf);
        t3=temp.Matr[k][i]-tmpf2;
        temp.Matr[k][i]=t3;
    }
}
L++;
}
    for (int i=0; i<temp.size; i++)
        det*=temp.Matr[i][i];
 
return det;
} 
void matrix::ReadInFile(FILE *f)        //читаем матрицу из файла
{
    for (int i=0; i<size; i++)
        for (int j=0; j<size; j++)
        {
            fscanf(f,"%lf",&Matr[i][j]);
        }
}
 
void matrix::Show() const
{
    printf("\n");
    for (int i=0; i<size; i++)
    {
        for (int j=0; j<size; j++)
        {
            printf("%.3lf  ",Matr[i][j]);
        }
        printf("\n");
    }
}

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
//main.cpp
 
 
#include "stdafx.h"
#include "matrix.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    FILE *fi;
    fi=fopen("test//input3.txt","r");
    matrix A(4);
    A.ReadInFile(fi);
    A.Show();
    FILE *f2;
    f2=fopen("test//test1.txt","r");
    matrix B(4);
    B.ReadInFile(f2);
    B.Show();
    matrix C(4);
    
    //C=A-B;
    C.Show();
    fclose(fi); fclose(f2);
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2011, 14:05     Не работает конструктор копирования #2
вы же память под матрицу не выделяете.
оператор равно тоже неверный. уже выделенной памяти может не хватить. матрица в которую идет присваивание может по размеру быть меньше чем та, что справа от оператора =.

деструктор неверный. не все удаляется.

в конструкторе копирования можно вот таким трюком воспользоваться:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
matrix::matrix(const matrix &A)                 
//копирование - тот самый конструктор, который не рапботает
{
  Matrix tmp(A.size);
  size = tmp.size;
  Matr = tmp.Matr;
  tmp.size = 0;
  tmp.Matr = 0;
 
  for (int i=0; i<size; i++)
  {
    for (int j=0; j<size; j++)
    {
      Matr[i][j]=A.Matr[i][j];
    }
  }
}
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
10.12.2011, 14:45  [ТС]     Не работает конструктор копирования #3
как тогда исправить деструктор? чтобы удалял правильно
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2011, 15:37     Не работает конструктор копирования #4
в конструкторе такой код:
C++
1
2
3
4
5
Matr = new double*[size];
for (int i = 0; i < size; i++)
{
  Matr[i] = new double[size];
}
в деструкторе действия в обратном порядке, т.е.
C++
1
2
3
4
5
for (int i = 0; i < size; i++)
{
  delete [] Matr[i];
}
delete [] Matr;
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
12.12.2011, 10:08  [ТС]     Не работает конструктор копирования #5
Цитата Сообщение от DU Посмотреть сообщение
1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
matrix::matrix(const matrix &A) * * * * * * * * 
//копирование - тот самый конструктор, который не рапботает
{
 Matrix tmp(A.size);
 size = tmp.size;
 Matr = tmp.Matr;
 tmp.size = 0;
 tmp.Matr = 0;
for (int i=0; i<size; i++)
 {
 for (int j=0; j<size; j++)
 {
 Matr[i][j]=A.Matr[i][j];
 }
 }
}

конструктор копирования не правильный
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.12.2011, 10:13     Не работает конструктор копирования #6
доказательва?
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
12.12.2011, 14:24  [ТС]     Не работает конструктор копирования #7
вылетала ошибка и все.
да и деструктор выдавал ошибку в куче, оставил тот, что есть

а вот этот конструктор работает. чуть исправил и все
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
matrix::matrix(const matrix &A)                 
//копирование - тот самый конструктор, который не рапботает
{
size=A.size;
        Matr=new double*[size];
        for (int i=0; i<size; i++)
                Matr[i]=new double[size];
        
        for (int i=0; i<size; i++)
                for (int j=0; j<size; j++)
                {
                        Matr[i][j]=A.Matr[i][j];
                }
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.12.2011, 21:31     Не работает конструктор копирования #8
ну это где-то у вас ошибки еще есть. в том, что вы тут запостили в int _tmain(int argc, _TCHAR* argv[]) нет использования операторов или конструкторов копирования. значит есть код, где все криво. возможно мешаете операции с матрицами разного размера. у вас операторы заточенны под то, что матрицы одинакового размера. если эта мешанина есть, то развалы ожидаемы.


вот тестик. работает и не крашится:
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
#include "stdafx.h"
#include <iostream>
 
class matrix
{
public:
  double **Matr;
  int size;
 
public:
  matrix(int _N=0);
  matrix(const matrix& A);
  ~matrix();
  matrix& operator = (const matrix& A);
 
  bool operator == (const matrix& A) const;
};
 
matrix::matrix(int _N) : size(_N)
{
  Matr = new double* [size];
  for (int i = 0; i < size; i++)
  {
    Matr[i] = new double[size];
  }
 
  for (int i = 0; i < size; i++)
  {
    for (int j = 0; j < size; j++)
    {
      Matr[i][j] = 0;
    }
  }
}
 
matrix::~matrix()
{
  for (int i = 0; i < size; i++)
  {
    delete [] Matr[i];
  }
  delete [] Matr;
}
 
matrix::matrix(const matrix& A)                 
//копирование - тот самый конструктор, который не рапботает
{
  matrix tmp(A.size);
  size = tmp.size;
  Matr = tmp.Matr;
  tmp.size = 0;
  tmp.Matr = 0;
 
  for (int i=0; i<size; i++)
  {
   for (int j=0; j<size; j++)
   {
     Matr[i][j]=A.Matr[i][j];
   }
  }
}
 
matrix& matrix::operator = (const matrix& A)
{
  if (this != &A)
  {
    matrix tmp(A);
    std::swap(size, tmp.size);
    std::swap(Matr, tmp.Matr);
  }
  return *this;
}
 
bool matrix::operator == (const matrix& A) const
{
  if (size != A.size)
    return false;
 
  for (int i=0; i<size; i++)
  {
    for (int j=0; j<size; j++)
    {
      if (Matr[i][j]!=A.Matr[i][j])
        return false;
    }
  }
  return true;
}
 
int main()
{
  {
    matrix m1(10);
  }
 
  {
    matrix m1(10);
    m1.Matr[0][0] = 6;
    matrix m2(m1);
 
    const bool isSame1 = m1 == m2;
    const bool isSame2 = m2 == m1;
 
    if (isSame1 && isSame2)
      std::cout << "ok" << std::endl;
    else
      std::cout << "error" << std::endl;
  }
 
  {
    matrix m1(10);
    m1.Matr[0][0] = 6;
    matrix m2(0);
    m2 = m1;
 
    const bool isSame1 = m1 == m2;
    const bool isSame2 = m2 == m1;
 
    if (isSame1 && isSame2)
      std::cout << "ok" << std::endl;
    else
      std::cout << "error" << std::endl;
  }
 
 
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2011, 04:25     Не работает конструктор копирования
Еще ссылки по теме:

Как работает конструктор копирования C++
C++ не работает конструктор копирования
Как работает конструктор копирования? C++

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

Или воспользуйтесь поиском по форуму:
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
13.12.2011, 04:25  [ТС]     Не работает конструктор копирования #9
нет, развалы это в Вашем коде... у меня теперь все работает нормально
А ваш конструктор копирования криво сделан.
нафига вводить дополнительную матрицу, когда она тут вообще не нужна!!!!
Yandex
Объявления
13.12.2011, 04:25     Не работает конструктор копирования
Ответ Создать тему
Опции темы

Текущее время: 15:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru