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

Непонятная для меня ошибка - C++

Восстановить пароль Регистрация
 
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
08.04.2013, 22:33     Непонятная для меня ошибка #1
Доброго времени суток. Во время выполнения оператора присваивания вылетает ошибка "Access violation", происходит это в месте обращения к элементу массива переменной input (см. код). Если просто посмотреть что находится в массиве, то там вместо чего-то вразумительного находится "CXX0030: Error: expression cannot be evaluated".
Что это может значить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class matrix
{
public:
    matrix(int,int);
    ~matrix(void);
    int columns;//кол столбиков
    int rows;//кол строк
    double **mat;//сама матрица
    //double det(void);
    //matrix inverse(void);//нахождение обратной
    matrix transpon(void);
    void transpon_this(void);
    matrix operator=(const matrix &);//оператор присваивания
    matrix operator+(const matrix &);//оператор сложения
    matrix operator-(const matrix &);//оператор вычитания
    matrix operator*(const matrix &);//оператор умножения матриц
    bool operator==(const matrix &);//оператор сравнения
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
matrix matrix::operator=(const matrix &input)
{
    for (int i=0; i<rows;++i)
        delete [] mat[i];
    delete [] mat;
 
    rows=input.rows;
    columns=input.columns;
    mat=new double*[rows]; 
    for (int i=0;i<rows;++i)
        mat[i]=new double[columns];
 
    for (int i=0;i<rows;++i)
        for(int j=0;j<columns;++j)
            mat[i][j]=input.mat[i][j];
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
10
11
matrix matrix::operator+(const matrix & rightmatrix)
{
    if ((rows==rightmatrix.rows)&&(columns==rightmatrix.columns))
    {
        matrix temp(rows,columns);
        for (int i=0;i<rows;++i)
            for (int j=0;j<columns;++j)
                temp.mat[i][j]=mat[i][j]+rightmatrix.mat[i][j];
        return temp;
    } else return(matrix(0,0));
}
И как вообще правильно оформлять такие классы по канонам ООП?(если не сложно пример кода или ссылку на верный путь)

Спасибо всем ответившим!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 22:33     Непонятная для меня ошибка
Посмотрите здесь:

непонятная для меня ошибка прошу объяснить знающих людей C++
непонятная ошибка( C++
Непонятная ошибка C++
C++ Непонятная ошибка
C++ Непонятная ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 23:37     Непонятная для меня ошибка #21
Цитата Сообщение от metaluga145 Посмотреть сообщение
Но у меня по завершению программы (при возврате ссылки)
Что из этого можно понять? Какой ссылки, где ссылка, на что ссылка? Если бы я задал вам такой вопрос?

Добавлено через 2 минуты
Цитата Сообщение от metaluga145 Посмотреть сообщение
Я читал,что правильно оформлять операторы,которые возвращают ссылку, а не значение.
Где читали? Тоже хочу почитать...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.04.2013, 23:43  [ТС]     Непонятная для меня ошибка #22
alsav22, прошу прощения. очяпятка. не "при возврате ссылки", а "перед закрытием окна", то есть после выполнения system("pause").
Где конкретно не скажу, ибо брожу по сайтам с гугла. Аргументация в пользу ссылки была такой:"лишний раз не вызывается конструктор копирования, соответственно экономим время". На сколько этот аргумент правилен я оценить не могу, но то,что действительно не вызывается конструктор копирования, знаю точно. Сам проверял в другом проекте.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 23:56     Непонятная для меня ошибка #23
Цитата Сообщение от metaluga145 Посмотреть сообщение
Аргументация в пользу ссылки была такой:"лишний раз не вызывается конструктор копирования, соответственно экономим время"
Всё зависит от конкретного кода. Если в классе есть поля с указателями, то без явного конструктора копий не обойтись. У вас, в операторе +, возвращается копия локального объекта. А если бы был возврат по ссылке? Что дальше делать со ссылкой на объект, который исчезает при выходе из метода?

Добавлено через 3 минуты
Цитата Сообщение от metaluga145 Посмотреть сообщение
alsav22, прошу прощения. очяпятка. не "при возврате ссылки", а "перед закрытием окна", то есть после выполнения system("pause").
На вопрос не ответили. Какая ссылка, где ссылка, на что ссылка? Где код изменили, покажите...
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.04.2013, 00:08  [ТС]     Непонятная для меня ошибка #24
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё зависит от конкретного кода. Если в классе есть поля с указателями, то без явного конструктора копий не обойтись. У вас, в операторе +, возвращается копия локального объекта. А если бы был возврат по ссылке? Что дальше делать со ссылкой на объект, который исчезает при выходе из метода?
Я тоже задумывался над вопросом "что же делать со ссылкой на объект, который исчезает при выходе из метода?". Только теперь до меня дошло,что будет происходить в памяти.
Цитата Сообщение от alsav22 Посмотреть сообщение
На вопрос не ответили. Какая ссылка, где ссылка, на что ссылка? Где код изменили, покажите...
Вопрос про ссылку снимаю, ибо уже понял что за ошибка.

Спасибо за помощь. Вопросов пока что больше нет!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2013, 00:14     Непонятная для меня ошибка #25
Конструктор копий может вызываться ведь не только в методах, которые вы перегрузили, но и в других случаях. Поэтому, по ссылке вы возвращаете, или не по ссылке, но, если есть поля с указателями, нужно создавать конструктор для глубокого копирования.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.04.2013, 00:19  [ТС]     Непонятная для меня ошибка #26
Цитата Сообщение от alsav22 Посмотреть сообщение
конструктор для глубокого копирования.
Что значит "глубокое копирование"?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2013, 00:39     Непонятная для меня ошибка #27
Есть неявный конструктор копирования (конструктор поверхностного копирования), который предоставляется по умолчанию, если неопределён явный. Он просто копирует поля класса. Во многих случаях, этого вполне достаточно. Это всё похоже на работу явного и неявного операторов присваивания. В вашем коде задаётся явный оператор присваивания (по той же причине). Если бы работал неявный, то это выглядело бы так:

C++
1
2
3
4
5
6
7
8
matrix matrix::operator=(const matrix &input)
{
    rows = input.rows;
    columns = input.columns;
    mat = input.mat; 
    
    return *this;
}
Это и есть поверхностное присваивание. Для rows и columns это вполне подходит, а для mat - нет. Присваиваеся (или копируется) просто указатель, а не то, на что он ссылается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 01:53     Непонятная для меня ошибка
Еще ссылки по теме:

непонятная ошибка C++
C++ Неизвестная (для меня) ошибка в коде!
непонятная ошибка C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.04.2013, 01:53     Непонятная для меня ошибка #28
Если код немного изменить, то можно увидеть, где что срабатывает:
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
#include <iostream>
#include <string>
using namespace std;
 
class matrix
{
public:
    matrix(int rows, int columns)
    {
         cout << "K" << endl;
        
        matrix::rows=rows;
        matrix::columns=columns;
        mat=new double*[rows]; 
        for (int i=0;i<rows;++i)
            mat[i]=new double[columns];
    }
    
    matrix(const matrix &obj)
    {
         cout << "cpy" << endl;
        
        rows = obj.rows;
        columns = obj.columns;
        mat = new double*[rows]; 
        for (int i = 0; i < rows; ++i)
            mat[i] = new double[columns];
 
        for (int i = 0; i < rows; ++i)
            for(int j = 0; j < columns; ++j)
                mat[i][j] = obj.mat[i][j];
    }
    
    ~matrix()
    {
         cout << "~" << endl;
        for (int i = 0; i < rows; ++i)
            delete [] mat[i];
        delete [] mat;
    }
    
    int rows;//кол строк
    int columns;//кол столбиков
    
    double **mat;//сама матрица
    //double det(void);
    //matrix inverse(void);//нахождение обратной
    matrix transpon(void);
    void transpon_this(void);
    matrix operator=(const matrix &);//оператор присваивания
    matrix operator+(const matrix &);//оператор сложения
    //matrix operator-(const matrix &);//оператор вычитания
    //matrix operator*(const matrix &);//оператор умножения матриц
    //bool operator==(const matrix &);//оператор сравнения
};
 
matrix matrix::operator=(const matrix &input)
{
    cout << "=" << endl;
    
    for (int i=0; i<rows;++i)
        delete [] mat[i];
    delete [] mat;
 
    rows=input.rows;
    columns=input.columns;               
    mat=new double*[rows]; 
    for (int i=0;i<rows;++i)
        mat[i]=new double[columns];
 
    for (int i=0;i<rows;++i)
        for(int j=0;j<columns;++j)
            mat[i][j]=input.mat[i][j];
    return *this;
}
 
matrix matrix::operator+(const matrix & rightmatrix)
{
     cout << "+" << endl;
    if ((rows==rightmatrix.rows)&&(columns==rightmatrix.columns))
    {
        matrix temp(rows,columns);
        for (int i=0;i<rows;++i)
            for (int j=0;j<columns;++j)
                temp.mat[i][j]=mat[i][j]+rightmatrix.mat[i][j];
        return temp;
    } else return(matrix(0,0));
}
 
int main()
{
    {
        matrix a(1,1), b(1,1), c(0,0);
        a.mat[0][0] = 3;
        b.mat[0][0] = 7;
        c = a + b;
    
        for (int i = 0; i < c.rows; ++i)
            for (int j = 0; j < c.columns; ++j)
                cout << c.mat[i][j] << ' ';
        cout << endl;
    }
    
     
    system("pause");
    return 0;
}
Yandex
Объявления
11.04.2013, 01:53     Непонятная для меня ошибка
Ответ Создать тему
Опции темы

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