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

ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает - C++

Восстановить пароль Регистрация
 
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
04.01.2014, 03:05     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #1
Не правильно работает заполнение матрицы, заполняется только 0-ми.
Не срабатывает оператор +
Помогите разобраться и научиться....

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
#include <iostream>
#include <locale>
using namespace std;
 
class Matrix
{
protected:
    int m, n; // количество строк и столбцов матрицы
    double** a; // массив элементов матрицы
public:
    // конструкторы
    // конструктор по умолчанию
    Matrix::Matrix()
    {
        n = 0;
        m = 0;
        a = NULL;
    }
    // конструктор с параметрами – выделяет память заданного
    // размера и инициализирует элементы матрицы нулями
    Matrix::Matrix(int m1, int n1)
    {
        n = n1;
        m = m1;
        a = new double*[m];
        for (int i = 0; i < m; i++)
            a[i] = new double[n];
        for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = 0;
    }
    // конструктор копирования
    Matrix::Matrix(const Matrix& ob)
    {
        n = ob.n;
        m = ob.m;
        if (ob.a == NULL)
        {
            a = NULL;
            return;
        }
        a = new double*[m];
        for (int i = 0; i < m; i++)
            a[i] = new double[n];
        for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = ob.a[i][j];
    }
    // деструктор
    // деструктор выполняет освобождение памяти,
    // занимаемой двумерным массивом
    Matrix::~Matrix()
    {
        if (a != NULL)
        {
            for (int i = 0; i < m; i++)
                delete[] a[i];
            delete[] a;
        }
    }
    // операция сложения двух матриц (перегрузка)
    Matrix operator+(Matrix&);
    void Create_Matrix(); // функция заполнения матрицы случайными числами
    void Print_Matrix(); // функция распечатки матрицы
};
void Matrix::Create_Matrix() //заполненяем матрицу случайными числами
{
    cout << "Введите кол-во строк: ";
    cin >> m;
    cout << "Введите кол-во столбцов: ";
    cin >> n;
    Matrix temp(m, n);
    for (int i = 1; i < m; i++) //Цикл по строкам
    for (int j = 0; j < n; j++) //по столбцам
        temp.a[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
}
 
void Matrix::Print_Matrix() //Печатаем матрицу
{
    cout << "_____________________\n";
    Matrix temp(m, n);
    for (int i = 0; i < m; i++) //Цикл по строкам
    {
        for (int j = 0; j < n; j++) //По столбцам
        {
            cout.width(4); //Устанавливаем ширину между выводом текущего значения 
            cout << temp.a[i][j]; //Выводим текущее значение
        }
        cout << "\n"; //Переносим вывод на новую строчку (для красоты)
    }
    cout << "_____________________\n";
}
// операция сложения двух матриц
Matrix Matrix::operator + (Matrix& ob)
{
    if (ob.n == n && ob.m == m)
    {
        Matrix temp(m, n);
        for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            temp.a[i][j] = a[i][j] + ob.a[i][j];
        return temp;
    }
    else
        throw 1;
}
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Matrix a, b, c; //Объявляем матрицы a,b,c
    a.Create_Matrix(); //Заполняем случайными числами матрицу a
    cout << "Matrix A: " << endl;
    a.Print_Matrix(); //Печатаем
    b.Create_Matrix(); //Заполняем случайными числами матрицу b
    cout << "Matrix B: " << endl;
    b.Print_Matrix(); //Печатаем
    c = a + b; // Складываем матрицы a и b
    cout << "Matrix A+B: " << endl;
    c.Print_Matrix(); //Печатаем матрицу c
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 03:05     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает
Посмотрите здесь:

ООП перегрузка в классе! C++
C++ Перегрузка (бинарный, дружественный оператор)
C++ ООП перегрузка операторов
ООП перегрузка операторов сумма элементов C++
C++ ООП перегрузка операторов сумма элементов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
04.01.2014, 03:28     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #2
wazler,
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
void Matrix::Create_Matrix() //заполненяем матрицу случайными числами
{
    cout << "Введите кол-во строк: ";
    cin >> m;
    cout << "Введите кол-во столбцов: ";
    cin >> n;
     a = new double*[m];
        for (int i = 0; i < m; i++)
            a[i] = new double[n];
//    Matrix temp(m, n);
    for (int i = 0; i < m; i++) //Цикл по строкам
        for (int j = 0; j < n; j++) //по столбцам
            a[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
}   
 
void Matrix::Print_Matrix() //Печатаем матрицу
{
    cout << "_____________________\n";
   // Matrix temp(m, n);
    for (int i = 0; i < m; i++) //Цикл по строкам
    {
        for (int j = 0; j < n; j++) //По столбцам
        {
          //  cout.width(4); //Устанавливаем ширину между выводом текущего значения 
            cout << a[i][j]<<" "; //Выводим текущее значение
        }
        cout << "\n"; //Переносим вывод на новую строчку (для красоты)
    }
    cout << "_____________________\n";
}
Добавлено через 1 минуту
Методы создаются для того чтобы работать с закрытыми переменными класса, а вы постоянно создаете какойто temp объект и с ним работаете в методах. Одно дело когда вы вернете из функции этот темп, а другой когда должны менятся параметры объекта вызвавшего метод!

ну и тоесть в этой конкретной ситуации нужно просто убрать объект temp и все отлично работает. Ну и только в заполнении добавилось выделение памяти под массив...
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
04.01.2014, 04:09  [ТС]     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #3
newb_programmer, спасибо заполнение работает , только вот сложение все равно не работает.....
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
04.01.2014, 04:15     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #4
wazler, кароче сложение я уже запарился делать...=) плюс у вас перегружен правильно, косячина в конструкторе копирования, а вот это я знаю очень плохо, поэтому тяжко идет. В теории должно быть так:
проверяем есть ли у нас данные в объекте
C++
1
if (this!=NULL) ... // или if (a!=NULL)
если нету то выделяем память под новые размеры
...
если есть то удаляем (по старым размерам)
C++
1
2
3
    for (int i = 0; i < m; i++)
                delete a[i];
            delete [] a;
создаем новый чистый массив с новыми размерами, и пишем тудой значения. вот у меня ошибки при удалении идут, хз мож с утреца поправлю...щас уже поздно=)))))
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
04.01.2014, 04:23  [ТС]     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #5
newb_programmer, хорошо буду ждать твоего ответа, сам с утра тоже подумаю, что не так с конструктором копирования...Доброй ночи
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 04:33     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #6
Копирование там нормальное. Оператор присваивания нужен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Matrix& Matrix::operator = (const Matrix& ob)
{
    if (this == &ob) return *this;
    
    if (a != NULL)
    {
        for (int i = 0; i < m; i++)
            delete[] a[i];
        delete[] a;
    }
    m = ob.m;
    n = ob.n;
    a = new double*[m];
    for (int i = 0; i < m; i++)
        a[i] = new double[n];
    
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = ob.a[i][j];
 
    return *this;
}
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
04.01.2014, 10:17  [ТС]     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #7
alsav22, Спасибо большое! Всех с новым годом! )
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
04.01.2014, 12:59     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #8
alsav22, была мысля, что присваивания не хватает, но вот все равно сейчас не понятно. после выполнения
C++
1
c=a+b;
сначала вызывается "+".
потом вызывается конструктор копирования. для кого он вызывается, для "с"? и почему он вообще вызывается?
потом вызывается присваивание для объекта "с" я так понимаю. в нем есть проверка
C++
1
if (a != NULL)
которую он успешно пропускает, тоесть a==NULL для объекта "с" и значит конструктор копирования вызывался для когото другого, правильная цепочка?)))
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.01.2014, 13:15     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #9
Цитата Сообщение от wazler Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
void Matrix::Create_Matrix() //заполненяем матрицу случайными числами
{
 cout << "Введите кол-во строк: ";
 cin >> m;
 cout << "Введите кол-во столбцов: ";
 cin >> n;
 Matrix temp(m, n);
 for (int i = 1; i < m; i++) //Цикл по строкам
  for (int j = 0; j < n; j++) //по столбцам
   temp.a[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
}
А кто будет этот темп копировать в матрицу? Ты просто заполнил рандомами локальный об
объект и выбросил его при завершении метода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 13:20     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает
Еще ссылки по теме:

C++ Перегрузка операторов, оператор присваивания
ООП классы, перегрузка операторов C++
C++ Перегрузка оператора + для сложения матриц (С++, ООП, Классы, WinForms)

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 13:20     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает #10
Цитата Сообщение от newb_programmer Посмотреть сообщение
потом вызывается конструктор копирования. для кого он вызывается, для "с"? и почему он вообще вызывается?
operator+ возвращает копию (возврат по значению).
Yandex
Объявления
04.01.2014, 13:20     ООП, заполнение 0-ми вместо от 0 до 10, оператор + (перегрузка) не срабатывает
Ответ Создать тему
Опции темы

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