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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
#1

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

10.12.2011, 13:53. Просмотров 1342. Ответов 8
Метки нет (Все метки)

Пишу свой класс матрица.
В конструкторе копирования вылезла ошибка, решить которую мне не удается.
Отладчиком проходился не один раз, не помогает.

Вот написанный мною код
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2011, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает конструктор копирования (C++):

Не работает конструктор копирования - C++
Всем доброго времени суток. Помогите пожалуйста, уже битиый день не могу побороть почему не работает конструктор копирования :cry: ...

Не работает конструктор копирования - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; class my {int x1,x2,y1,y2,col; public: my(int _x1=20, int _y1=5,...

Конструктор копирования не работает - C++
Прошу вас помочь разобраться с конструктором копирования. Проблема в следующем при вызове конструктора копирование вылетает ошибка не...

Как работает конструктор копирования - C++
дан класс я не могу понять как работает конструктор копирования arr.h#pragma once #include &lt;iostream&gt; #include &lt;fstream&gt; #include...

Как работает конструктор копирования? - C++
ECM::ECM(const ECM &amp;E) //êîíñòðóêòîð êîïèðîâàíèÿ { if (E.type) {type= new char ; strcpy(type, E.type);} else type=0; ...

Не работает конструктор копирования почему-то... - C++
#include &quot;stdlib.h&quot; #include &quot;stdio.h&quot; #include &lt;iostream&gt; #include &lt;cstddef&gt; using namespace std; class Top { public: ...

8
DU
1483 / 1129 / 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];
    }
  }
}
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
10.12.2011, 14:45  [ТС] #3
как тогда исправить деструктор? чтобы удалял правильно
0
DU
1483 / 1129 / 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;
0
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];
 }
 }
}

конструктор копирования не правильный
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.12.2011, 10:13 #6
доказательва?
0
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];
                }
0
DU
1483 / 1129 / 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;
}
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
13.12.2011, 04:25  [ТС] #9
нет, развалы это в Вашем коде... у меня теперь все работает нормально
А ваш конструктор копирования криво сделан.
нафига вводить дополнительную матрицу, когда она тут вообще не нужна!!!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2011, 04:25
Привет! Вот еще темы с ответами:

Класс матрица (не работает конструктор копирования) - C++
так вот,что-то глючит конструктор копирования, хотя ошибок компиляции не дает(( #include &lt;fstream&gt; #include &lt;iostream&gt; #include...

Неправильно работает конструктор копирования list, почему? - C++
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;list&gt; #include &lt;iterator&gt; #include &lt;iostream&gt; using namespace std; list...

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
13.12.2011, 04:25
Ответ Создать тему
Опции темы

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