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

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

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

Ошибка при перегрузке оператора, не знаю как исправить - C++

05.12.2012, 00:57. Просмотров 519. Ответов 6
Метки нет (Все метки)

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
151
152
153
#pragma once
 
#include <iostream>
#include <vector>
#define innerVectorType std::vector<T>
 
template <class T>
class Matrix
{
public:
    Matrix();
    Matrix(std::vector<innerVectorType> vect);
    void printMatrix();
    std::vector<innerVectorType> getMatrixVector();
    int getHeight();
    int getWidth();
    Matrix<T> operator*(Matrix<T> m);
    friend Matrix<T> operator*(T k, Matrix<T> m);
    friend Matrix<T> operator*(Matrix<T> m, T k);
    friend Matrix<T> operator+(Matrix<T> m1, Matrix<T> m2);
private:
    void keyboardMatrixInitialization();
    void fromFileMatrixInitialization();
private:
    std::vector<innerVectorType> matrix;
    unsigned int myHeight;
    unsigned int myWidth;
};
 
template <class T>
Matrix<T>::Matrix() {
    std::cout<<"Choose:"<<std::endl<<" 1 - to enter matrix values from the keyboard."<<std::endl
        <<" 2 - to read matrix from file."<<std::endl
        <<"Choose the way to initialize matrix: ";
    short int wayOfMatrixInitialization;
    std::cin>>wayOfMatrixInitialization;
    std::cout<<std::endl;
    reEntered:
    switch(wayOfMatrixInitialization) {
    case 1: keyboardMatrixInitialization(); break;
    case 2: fromFileMatrixInitialization(); break;
    default: std::cout<<"Wrong choice. Please choose correct way of initialization: ";
        std::cin>>wayOfMatrixInitialization; 
        std::cout<<std::endl; 
        goto reEntered;
    }
}
 
template <class T>
Matrix<T>::Matrix(std::vector<innerVectorType> vect) {
    matrix = vector::vector(vect);
    myHeight = vect.size();
    myWidth = vect.begin().size();
}
 
template <class T>
int Matrix<T>::getHeight() {
    return myHeight;
}
 
template <class T>
int Matrix<T>::getWidth() {
    return myWidth;
}
 
template <class T>
void Matrix<T>::keyboardMatrixInitialization() {
    std::cout<<"Enter the matrix size with a space between (ex.: heigth width): ";
    std::cin>>myHeight>>myWidth;
    std::cout<<"Enter matrix values:"<<std::endl;
    for(unsigned int i = 0; i < myHeight; i++) {
        matrix.push_back(std::vector<T>());
        for(unsigned int j = 0; j < myWidth; j++) {
            T value;
            std::cin>>value;
            matrix.at(i).push_back(value);
        }
    }
    std::cout<<"Done."<<std::endl<<std::endl;
}
 
template <class T>
void Matrix<T>::fromFileMatrixInitialization() {
    //TODO
}
 
template <class T>
std::vector<innerVectorType> Matrix<T>::getMatrixVector() {
    return matrix;
}
 
template <class T>
Matrix<T> operator*(T k, Matrix<T> m) {
    std::vector<innerVectorType> resultVector;
    for(unsigned int i = 0; i < m.getHeight; i++) {
        resultVector.push_back(std::vector<T>());
        for(unsigned int j = 0; j < m.getWidth; j++) {
            resultVector.at(i).push_back(k*mVector[i][j]);
        }
    }
    return new Matrix<T>(resultVector);
}
 
template <class T>
Matrix<T> operator*(Matrix<T> m, T k) {
    std::vector<innerVectorType> resultVector;
    for(unsigned int i = 0; i < m.getHeight; i++) {
        resultVector.push_back(std::vector<T>());
        for(unsigned int j = 0; j < m.getWidth; j++) {
            resultVector.at(i).push_back(k*mVector[i][j]);
        }
    }
    return new Matrix<T>(resultVector);
}
 
template <class T>
Matrix<T> Matrix<T>::operator*(Matrix<T> m) {
    //TODO
}
 
template <class T>
Matrix<T> operator+(Matrix<T> m1, Matrix<T> m2) {
    if((m1.getHeight() != m2.getHeight()) || (m1.getWidth != m2.getWidth())) {
        throw std::invalid_argument("Matrixs' sizes are not equal.");
    }
    std::vector<innerVectorType> m1Vector = m1.getMatrixVector();
    std::vector<innerVectorType> m2Vector = m2.getMatrixVector();
    std::vector<innerVectorType> resultVector;
    int height = m1.getHeight();
    int width = m2.getWidth();
    for(unsigned int i = 0; i < height; i++) {
        resultVector.push_back(std::vector<T>());
        for(unsigned int j = 0; j < width; j++) {
            resultVector.at(i).push_back(m1Vector[i][j]+m2Vector[i][j]);
        }
    }
    return new Matrix<T>(resultVector);
}
 
template <class T>
void Matrix<T>::printMatrix() {
    std::cout<<"Matrix:"<<std::endl;
    for(unsigned int i = 0; i < myHeight; i++) {
        for(unsigned int j = 0; j < myWidth; j++) {
            if(j != myWidth-1) {
                std::cout<<matrix[i][j]<<" ";
            } else {
                std::cout<<matrix[i][j]<<std::endl;
            }
        }
    }
    std::cout<<std::endl;
}
Это был код класса.

Файл main():
C++
1
2
3
4
5
6
7
8
9
int _tmain(int argc, _TCHAR* argv[])
{
    Matrix<int> m1 = Matrix<int>();
    m1.printMatrix();
    Matrix<int> m2 = Matrix<int>();
    m2.printMatrix();
    Matrix<int> m3 = m1 + m2;
    return EXIT_SUCCESS;
}
Ошибка такая: error LNK2019: unresolved external symbol "class Matrix<int> __cdecl operator+(class Matrix<int>,class Matrix<int>)" (??H@YA?AV?$Matrix@H@@V0@0@Z) referenced in function _wmain

Я так понимаю она относится к этому участку:
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T>
Matrix<T> operator*(T k, Matrix<T> m) {
    std::vector<innerVectorType> resultVector;
    for(unsigned int i = 0; i < m.getHeight; i++) {
        resultVector.push_back(std::vector<T>());
        for(unsigned int j = 0; j < m.getWidth; j++) {
            resultVector.at(i).push_back(k*mVector[i][j]);
        }
    }
    return new Matrix<T>(resultVector);
}
Друзья, как решить не подскажите?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2012, 00:57     Ошибка при перегрузке оператора, не знаю как исправить
Посмотрите здесь:

Ошибка при перегрузке оператора + - C++
Имеется класс, который представляет из себя строку и количество символов в ней. Задача - перегрузить оператор +, чтобы он складывал нам две...

Ошибка при перегрузке оператора >> - C++
Приветствую. Есть 2 класса: enum Color { white = 1, red, green, blue, yellow }; class Shape { protected: Color figureCol; ...

Ошибка при перегрузке оператора cin >> - C++
#include &lt;iostream&gt; using namespace std; /////////////////////////////////////////////////////////// class fraction { ...

Ошибка при перегрузке оператора вывода в файл - C++
Добрый день, есть такой кусок кода: #include &lt;iostream&gt; #include &lt;ostream&gt; using std::ostream; using namespace std; ...

Ошибка в перегрузке оператора - при работе с массивами - C++
Текст программы: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...

Ошибка в перегрузке оператора = - C++
В классе множество нужно перегрузить оператор = так, чтобы была возможность присвоить f(x)=const. Подскажите, где ошибка в этом коде. ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.12.2012, 04:21     Ошибка при перегрузке оператора, не знаю как исправить #2
Отказаться от дружественных конструкций.
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,405
Записей в блоге: 17
05.12.2012, 05:13     Ошибка при перегрузке оператора, не знаю как исправить #3
Цитата Сообщение от aoool Посмотреть сообщение
Я так понимаю она относится к этому участку:
Builder Пишит что
Код
[ILINK32 Error] Error: Unresolved external 'operator +(Matrix<int>, Matrix<int>)' referenced from C:\USERS\FUJITSU\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG_BUILD\FILE1.OBJ
Т.е. к
C++
1
friend Matrix<T> operator+(Matrix<T> m1, Matrix<T> m2);
Собственно а за чем там дружественность? Относительно самого себя ?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.12.2012, 05:40     Ошибка при перегрузке оператора, не знаю как исправить #4
Цитата Сообщение от aoool Посмотреть сообщение
Я так понимаю она относится к этому участку:
Пока к этому, потому что в main() только сложение объектов. Если в main() применить умножение объектов, то будет такая же ошибка.
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,405
Записей в блоге: 17
05.12.2012, 05:53     Ошибка при перегрузке оператора, не знаю как исправить #5
Ну так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <class T>
Matrix<T> operator*(T k, Matrix<T> m) {
        std::vector<innerVectorType> resultVector;
        for(unsigned int i = 0; i < m.getHeight; i++) {
                resultVector.push_back(std::vector<T>());
                for(unsigned int j = 0; j < m.getWidth; j++) {
                        resultVector.at(i).push_back(k*mVector[i][j]);
                }
        }
        return new Matrix<T>(resultVector);
}
 
template <class T>
Matrix<T> operator*(Matrix<T> m, T k) {
        std::vector<innerVectorType> resultVector;
        for(unsigned int i = 0; i < m.getHeight; i++) {
                resultVector.push_back(std::vector<T>());
                for(unsigned int j = 0; j < m.getWidth; j++) {
                        resultVector.at(i).push_back(k*mVector[i][j]);
                }
        }
        return new Matrix<T>(resultVector);
}
А почему тут указатель возвращается ?
C++
1
return new Matrix<T>(resultVector);
Как то не правильно...
aoool
Сообщений: n/a
05.12.2012, 18:46     Ошибка при перегрузке оператора, не знаю как исправить #6
Да, там есть еще парочка ошибочек с недопониманием что есть указатель, а что нет, но я уже исправил их (еще вчера) и все равно так же ошибка, может потому что для собственных классов, инициализированных как переменная, а не как указатьль нужно помимо этого еще и "=" определять?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 00:18     Ошибка при перегрузке оператора, не знаю как исправить
Еще ссылки по теме:

Ошибка в перегрузке оператора += - C++
#include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; const int da=256; class stroki { public: stroki(); ...

Ошибка в перегрузке оператора - C++
Не пойму в чем дело(( Имеется класс вектор ,вычислил длину,а теперь очу сравнить их величины,но не могу составить данный оператор выдает...

Ошибка в перегрузке оператора пересечения - C++
Пожалуйста, помогите найти ошибку! При перегрузке оператора пересечения (*) в return tmp возникает ошибка. ООП только учу, поэтому еще...

Предупреждение при перегрузке оператора - C++
Есть вот такой код для созданный для обучения #include &lt;iostream&gt; using namespace std; class complex{ private: ...


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

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,405
Записей в блоге: 17
06.12.2012, 00:18     Ошибка при перегрузке оператора, не знаю как исправить #7
Ну собственно конструктор по умолчанию,копирование и присвоение это как правило надо делать... но здесь они нужны как бы для "быстрого копирования" через swap(), а работать по идее должно и без них
Yandex
Объявления
06.12.2012, 00:18     Ошибка при перегрузке оператора, не знаю как исправить
Ответ Создать тему
Опции темы

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