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

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

Войти
Регистрация
Восстановить пароль
 
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
#1

Не выходит перегрузка операторов - C++

22.12.2013, 00:05. Просмотров 255. Ответов 5
Метки нет (Все метки)

Класс матрица, перегруженные др. операции. Ошибок не выдает. Через дебаг проверил, не заносятся значения в массивы. Может я что-то с конструкторами намудрил, или еще с чем-то. Прошу помочь, лабы сдавать срочно нужно)
И еще, как сделать оператор присваивания, а то я постоянно натыкаюсь на non-static member.

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
#include <iostream>
#include <stdio.h>
#include <locale>
 
using namespace std;
 
class CMatrix
{
private:
    int Matr[8][8];
    int rows, cells;
    
public:     
    CMatrix();
    CMatrix(int n, int m);
    CMatrix Input(int i, int j);
    void SetRows(int r){rows = r;}
    void SetCells(int c){cells = c;}
    void SetElement(int i, int j);
    int GetRows(){return rows;}
    int GetCells(){return cells;}
    int GetElement(int i, int j){return Matr[i][j];}
 
    //CMatrix & operator = (const CMatrix &a);
    friend CMatrix operator + (CMatrix &A, CMatrix &B);
    friend CMatrix operator * (CMatrix &A, CMatrix &B);
    friend CMatrix transp(CMatrix &A);
    void Show(CMatrix &temp);
    
};
 
CMatrix ::CMatrix()
{
    for(int i = 0; i < 5; i++)
        for(int j = 0; j < 5; j++)
            Matr[i][j] = 0;
}
 
CMatrix :: CMatrix(int n, int m)
{
    rows = n; cells = m;
    for(int i = 0; i < rows; i++)
        for(int j = 0; j < cells; j++)
            Matr[i][j] = 0;
}
 
CMatrix CMatrix::Input(int i, int j)
{   
    CMatrix temp(this->rows = i,this->cells = j);   
    printf("\nВведите %d элементов\n", i*j);
    for(int i = 0; i < temp.rows; i++)
        for(int j = 0; j < temp.cells; j++)
            cin >> temp.Matr[i][j];
    return temp;
}
 
void Show(CMatrix &temp)
    {
        for(int i = 0; i < temp.GetRows(); i++)
        {
            cout << endl;
            for(int j = 0; j < temp.GetCells(); j++)
            {
                cout << temp.GetElement(i,j) << " ";
            }
        }
    }
 
CMatrix operator + (CMatrix &A, CMatrix &B)
    {   
        CMatrix temp(A.rows, B.cells);
        if(A.rows == B.cells && A.rows == B.rows)
        {
            for(int i = 0; i < A.rows; i++)
                for(int j = 0; j < B.cells; j++)
                    temp.Matr[i][j] = A.Matr[i][j] + B.Matr[i][j];
        }
        else
            cout << "\n Размеры матриц несовпадают!\n";
        return temp;
    }
 
CMatrix operator * (CMatrix &A, CMatrix &B)
    {
        CMatrix temp(A.rows, B.cells);
        if(A.rows == B.cells)
        {               
            for(int i = 0; i < A.rows; i++)
                for(int j = 0; j < B.cells; j++)
                    temp.Matr[i][j] = A.Matr[i][j] + B.Matr[j][i];  
        }
        else
            cout << "\n Размеры матриц несовпадают!\n";
        return temp;
    }
 
CMatrix transp(CMatrix &A)
{
    CMatrix temp(A.rows, A.cells);
    for(int i = 0; i < A.rows; i++)
            for(int j = 0; j < A.cells; j++)
                temp.Matr[i][j] = A.Matr[j][i];
    return temp;
}
 
int main()
{
    setlocale(LC_ALL, "Rus");   
    int n, m;
    CMatrix A, B;
    CMatrix Plus, Multiply, Trans, Print;
    cout << "Введите размер первой матрицы (NxM): ";
    scanf_s("%d%*c%d", &n, &m);
    A.Input(n, m);
    cout << "Введите размер второй матрицы (NxM): ";
    scanf_s("%d%*c%d", &n, &m);
    B.Input(n, m);
    Plus = A + B;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2013, 00:05     Не выходит перегрузка операторов
Посмотрите здесь:

C++ перегрузка операторов C++
C++ Перегрузка операторов
Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов
C++ Перегрузка операторов
C++ Не выходит перегрузка << и >>
C++ Перегрузка операторов
Перегрузка операторов C++
C++ Перегрузка операторов
Перегрузка операторов C++
C++ Перегрузка операторов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
25.12.2013, 16:37     Не выходит перегрузка операторов #2
Вы сами себя запутали. У вас метод Input вызывается на матрице, т.е. по идее должен её заполнять, но вы зачем-то в нём создаёте матрицу temp и заполняете её, а затем возвращаете заполненную матрицу из метода. Но в функции main вы никуда этот результат не сохраняется, потому что ожидаете, что метод не вернёт новую матрицу, а заполнит ту, на которой был вызван.
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
25.12.2013, 16:47  [ТС]     Не выходит перегрузка операторов #3
Подправил метод Input.

C++
1
2
3
4
5
6
7
8
9
10
CMatrix CMatrix::Input(int i, int j)
{   
    this->rows = i;
    this->cells = j;    
    printf("\nВведите %d элементов\n", i*j);
    for(int i = 0; i < this->rows; i++)
        for(int j = 0; j < this->cells; j++)
            cin >> this->Matr[i][j];
    return *this;
}



Теперь возникли проблемы с Show:
Error 1 error LNK2019: unresolved external symbol "public: void __thiscall CMatrix::Show(class CMatrix &)" (?Show@CMatrix@@QAEXAAV1@@Z) referenced in function _main CMatrix.obj
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
25.12.2013, 16:55     Не выходит перегрузка операторов #4
HUSTLIN, будьте внимательнее. Show у вас описана как глобальная функция, а не как метод. Вместо
C++
1
void Show(CMatrix &temp)
нужно
C++
1
void CMatrix::Show(CMatrix &temp)
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
25.12.2013, 20:57  [ТС]     Не выходит перегрузка операторов #5
Все, сделал
C++
1
2
3
4
5
6
7
8
9
void CMatrix::Show()
{
    for(int i = 0; i < this->GetRows(); i++)
    {
        cout << endl;
        for(int j = 0; j < this->GetCells(); j++)
            cout << this->GetElement(i,j) << " ";
    }
}
Большое спасибо!)

Добавлено через 1 час 1 минуту
Прошу помощи в реализации оператора =
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
25.12.2013, 21:05     Не выходит перегрузка операторов #6
HUSTLIN, в принципе, он вам тут не нужен, правильно работает и оператор присваивания по умолчанию. А вообще, как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
CMatrix& operator=(const CMatrix& matrix)
{
    if (this != &matrix) {
        rows = matrix.rows;
        cells = matrix.cells;
        for(int i = 0; i < rows; i++)
            for(int j = 0; j < cells; j++)
                Matr[i][j] = matrix.Matr[i][j];
    }
 
    return *this;
}
Учтите, что поле Matr у вас имеет размерность 8, но нигде не проверяется, не превышают ли задаваемые размеры этой границы.
Yandex
Объявления
25.12.2013, 21:05     Не выходит перегрузка операторов
Ответ Создать тему
Опции темы

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