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

Ошибка при работе с объектами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нахождения цикла в орграфе http://www.cyberforum.ru/cpp-beginners/thread966102.html
Задан орграф списком смежности, при этом его вершинами являются строчные латинские символы. Описание выглядит примерно так: <описание i-ой вершины> ::= <символ, записанный в i-й вершине> <число di...
C++ Посчитать количество различных элементов массива Собственно задача обозначена в заглавии темы. НЕ могу понять что неправильно в моем говнокоде (постоянно вывадит 100). Подскажите пожалста что нетак? for (iii = 0; iii <100; iii++) { ... http://www.cyberforum.ru/cpp-beginners/thread966089.html
C++ Список структур данных
Имеется вот такое задание: Описать, используя структуру данных запись, школьный класс (Фамилия и инициалы, дата рождения, месяц рождения, год рождения). Составить программу, выдающую список учеников,...
C++ Если a или b не число
Решил для разминки написать действие сложения, так как сам не писал его не разу, решил попробовать. всё получилось с 1 раза, но проблема в том что мне нужно если a или b не равно числу то программа...
C++ Нахождение элементов массива, встречающихся не менее определенного количества раз http://www.cyberforum.ru/cpp-beginners/thread966059.html
В файле записано огромное количество таких же огромных чисел (например, один миллиард чисел, каждое из которых находится в промежутке от нуля до миллиарда). Числа эти считываются последовательно, то...
C++ Функция Помогите в етой задаче использовать функцию #include <iostream> #include <math.h> #include <cmath> using namespace std; int main() { double y; double x; for (x=0.1 ; x<=1 ; x=x+0.09) подробнее

Показать сообщение отдельно
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 163

Ошибка при работе с объектами - C++

30.09.2013, 23:37. Просмотров 502. Ответов 19
Метки (Все метки)

Доброго времени суток!
Я написал программу для работы с матрицами.
При умножении происходит следующее:
Matrix M3 = M1 * M2; // после этого M3 = M1.
Отладка показала, что возвращаемый из оператора * объект уничтожается, а затем копирующий конструктор копирует M1 в M3.

Помогите, пожалуйста, разобраться.

Объявление класса
Кликните здесь для просмотра всего текста
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
#pragma once
 
class Matrix
{
private:
    int** matrix; // указатель на двухмерный массив
    int rows, columns; // число строк и столбцов
    bool Init; // инициализирована ли матрица
 
public:
    Matrix (int sizeX, int sizeY, int** table = nullptr);
    Matrix (const Matrix& obj); // копирующий конструктор
    ~Matrix ();
 
    int Transposition (); //транспонирование
    double Determinant (); // поиск определителя
 
    int Print (); // вывод на экран
    bool Read (char filename []); // чтение матрицы из файла
    bool Load (char filename []); // сохранение в файл
 
    Matrix& operator= (const Matrix& obj); // оператор присваивания
 
    Matrix operator*= (Matrix& obj);
    friend Matrix operator* (Matrix& obj1, Matrix& obj2);
 
};


Конструкторы
Кликните здесь для просмотра всего текста
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
Matrix :: Matrix (int SizeX, int SizeY, int** table): rows (SizeY), columns (SizeX), Init (false)
{
    if (table == nullptr) // если нет инициализатора матрицы
    {
        // выделение памяти под двухмерный массив
        matrix = new int* [SizeY];
        for (int i = 0; i < SizeY; i ++)
            *(matrix + i) = new int [SizeX];
    }
 
    else
    {
        matrix = table;
        for (int i = 0; i < SizeY; i ++)
            *(matrix + i) = *(table + i);
    }
 
 
}
 
Matrix :: Matrix (const Matrix& obj)
{
    // выделяем память
    this -> matrix = new int* [obj.rows];
    for (int i = 0; i < obj.rows; i ++)
        *(matrix + i) = new int [obj.columns];
 
    this -> rows = obj.rows;
    this -> columns = obj.columns;
 
    // копируем значения
    for (int i = 0; i < this -> rows; i ++)
        for (int j = 0; j < this -> columns; j ++)
            this -> matrix [i] [j] = obj.matrix [i] [j];
}


Деструктор
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
Matrix :: ~Matrix ()
{
    for (int i = 0; i < this -> rows; i ++)
        delete [] matrix [i];
 
    delete [] matrix;
 
    delete [] combination;
}


Оператор присваивания
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Matrix& Matrix :: operator= (const Matrix& obj)
{
    if (this != &obj) // если не самоприсваивание
    {
        //if (this -> rows != obj.rows || this -> columns != obj.columns)
        //  throw BadSize ();
 
        // копируем значения
        for (int i = 0; i < this -> rows; i ++)
            for (int j = 0; j < this -> columns; j ++)
                this -> matrix [i] [j] = obj.matrix [i] [j];
 
    }
 
    return *this;
}


Оператор умножения
Кликните здесь для просмотра всего текста
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
Matrix Matrix :: operator*= (Matrix& obj)
{
    //if (!this -> Init || !obj.Init)
    //  throw NotInit ();
 
    //if (this -> columns != obj.rows)
        //throw BadSize ();
 
    // выделяем память под новую матрицу
    int** table = new int* [this -> rows];
    for (int i = 0; i < this -> rows; i ++)
        *(table + i) = new int [obj.columns];
 
    // следующий страшный алгоритм умножает строки на столбцы
    int a;
    int x = -1, y = -1;
 
    for (int k = 0; k < this -> rows; k ++)
    {
        y ++;
        x = -1;
        for (int i = 0; i < obj.rows; i ++)
        {
            a = 0;
            x++;
            for (int j = 0; j < this -> columns; j ++)
                a += this -> matrix [k] [j] * obj.matrix [j] [i];
 
            table [y] [x] = a;
        }
    }
 
    return Matrix (x + 1, y + 1, table);
}


И, на всякий, случай, main
Кликните здесь для просмотра всего текста
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
#include <iostream>
using std :: cout;
using std :: cin;
 
#include "Class_Matrix.h"
 
#include <Windows.h>
 
int main ()
{
    setlocale (LC_ALL, "Rus");
 
    Matrix M1 (2, 2);
    M1.Read ("1.txt");
    
    Matrix M2 (2,2);
    M2.Read ("2.txt");
 
    Matrix M3 = M1 * M2;
    M3.Load ("3.txt");
 
    system ("pause");
    return 0;
}


P.s. в Read и Load матрицы считываются из файла и, соответственно, записываются.

Буду рад любой помощи и замечаниям по коду. Заранее спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru