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

Приведение типов. - C++

Восстановить пароль Регистрация
 
GeneMeister
1 / 1 / 0
Регистрация: 30.04.2012
Сообщений: 7
30.04.2012, 12:05     Приведение типов. #1
Доброго времени суток!

В общем, есть класс Matrix(прямоугольные над полем вещ. чисел). Необходимо реализовать приведение типов Matrix -> double и double -> Matrix. Значит, как я пытаюсь это сделать:
C++
1
2
3
4
5
6
7
8
9
10
class Matrix{
private:
double** data;
//..
public:
//...
Matrix& operator =(double a);
Matrix(double a); // Значит, так привожу double к Matrix. Это вроде работает.
operator double(); // Matrix->double. Тоже работает, но пытается привести где ни поподя.
}
Реализация operator double():
C++
1
2
3
4
5
6
Matrix::operator double()
{
if(m!=1 || n!=1)//m и n количество строк и столбцов соответственно.
throw cantConv();
return data[0][0];
}
Проблема следующая:
Когда какая-либо функция возвращает значиние типа Matrix, почему-то срабатывает operator double(). Например:
C++
1
2
3
4
5
6
7
Matrix Matrix::operator + (Matrix& const A)
{
//...
Matrix result;
//...
return result;// Вот тут пытается привести и, что логично, вылетает исключение типа cantConv(т.к. размерность больше 1).
}
Буду благодарен за помощь.

Добавлено через 20 минут
Ах да, вызов operator+ происходит следующим образом:
C++
1
2
Matrix A(2,2), B(2,2), C;
C = A+B;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2012, 12:05     Приведение типов.
Посмотрите здесь:

C++ Приведение типов
Приведение типов C++
C++ Приведение типов?
Приведение типов C++
C++ Приведение типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
30.04.2012, 12:12     Приведение типов. #2
Оператор присваивания от матрицы (Matrix = Matrix) определён? И конструктор копирования тоже бы неплохо иметь.
GeneMeister
1 / 1 / 0
Регистрация: 30.04.2012
Сообщений: 7
30.04.2012, 12:20  [ТС]     Приведение типов. #3
Да, оператор присваивания и конструктор копирования определены и работают как часы, если закомментировать определение operator double().

Добавлено через 5 минут
Хотя, простите... я не правильно указал место вылета исключения:
На самом деле так:
C++
1
2
3
4
5
6
7
8
Matrix& Matrix::operator=(Matrix& const A)
{
    getMemory(A.m, A.n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            data[i][j] = A.data[i][j];
    return *this; // Вот тут вылетает
}
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
30.04.2012, 12:29     Приведение типов. #4
GeneMeister, хорош уже кусками выкладывать
давай весь код
GeneMeister
1 / 1 / 0
Регистрация: 30.04.2012
Сообщений: 7
30.04.2012, 12:48  [ТС]     Приведение типов. #5
Matrix.h:

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
#ifndef Matrix_h__
#define Matrix_h__
#include <iostream>
#include <exception>
using namespace std;
 
class badDim:public exception
{
    virtual const char* what() const throw();
};
class notConv:public exception
{
    virtual const char* what() const throw();
};
class Matrix 
{
protected:
    double** data;
    int m;
    int n;
    void destruct();
public:
    void getMemory(int _m, int _n);
    Matrix();
    Matrix(int m, int n);
    Matrix& operator =(Matrix& const A);
    Matrix& operator =(double a);
    Matrix(Matrix& const A);
    Matrix(double a);
    ~Matrix();
    int getn();
    int getm();
    double* operator[](int i);
    Matrix operator +(Matrix& const A);
    operator double();
};
istream& operator >> (istream& in,Matrix& A);
ostream& operator << (ostream& out,Matrix& const A);
#endif
Matrix.cpp:
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
#include <cstddef>
#include "Matrix.h"
#include <cmath>
#define eps 1e-6
 
void Matrix::destruct()
{
    for (int i = 0; i < m; i++)
    {
        delete [] data[i];
    }
    delete [] data;
    data = NULL;
}
void Matrix::getMemory(int _m, int _n)
{
    if (data == NULL)
    {
        data = new double*[_m];
        for (int i = 0; i < _m; i++)
        {
            data[i] = new double[_n];
        }
        m = _m;
        n = _n;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                data[i][j] = 0;
    }
    else
    {
        destruct();
        getMemory(_m, _n);
    }
}
Matrix::Matrix()
{
    data = NULL;
    getMemory(1, 1);
    data[0][0] = 0;
}
Matrix::Matrix(int _m, int _n)
{
    data = NULL;
    getMemory(_m, _n);
}
Matrix& Matrix::operator=(Matrix& const A)
{
    getMemory(A.m, A.n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            data[i][j] = A.data[i][j];
    return *this;
}
Matrix& Matrix::operator=(double a)
{
    getMemory(1,1);
    data[0][0] = a;
    return *this;
}
Matrix::Matrix(Matrix& const A)
{
    data = NULL;
    *this = A;  
}
Matrix::Matrix(double a)
{
    data = NULL;
    getMemory(1, 1);
    *this = a;
}
Matrix::~Matrix()
{
    destruct();
}
 
int Matrix::getn()
{
    return n;
}
int Matrix::getm()
{
    return m;
}
ostream& operator << (ostream& out,Matrix& const A)
{
    int n = A.getn(), m = A.getm();
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
            out << A[i][j] << '\t';
        out << '\n';
    }
    return out;
}
Matrix Matrix::operator +(Matrix& const A)
{
    if (m != A.m || n != A.n)
        throw badDim();
    Matrix result(m, n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
        {
            result[i][j] = data[i][j]+A[i][j];
        }
    return result;
}
 
istream& operator >> (istream& in, Matrix& A)
{
    int k = 0;
    while (in.good())
    {
        double d;
        in >> d;
        k++;
    }
    in.clear();
    in.seekg(ios::beg);
    int m = 0;
    while (in.good())
    {
        char buf[256];
        in.getline(buf, 255);
        m++;
    }
    int n = k/m;
    in.clear();
    in.seekg(ios::beg);
    A.getMemory(m,n);
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            in>>A[i][j];
    return in;
}
double* Matrix::operator[](int i)
{
    return data[i];
}
Matrix::operator double()
{
    if(m != 1 || n != 1)
        throw notConv();
    return data[0][0];
}
const char* badDim::what() const throw()
{
    return "Operands have incompatible dimensions.";
}
const char* notConv::what() const throw()
{
    return "Can't convert Matrix to double.";
}
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Matrix.h"
int main()
{
    Matrix A(2,2), B(2,2), C;
    try
    {
        C=A+B;
        cout << C;
        return 0;
    }
    catch(exception& e)
    {
        cerr << e.what();
        return 1;
    }   
}
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
30.04.2012, 12:59     Приведение типов. #6
C++
1
Matrix& const A
это не конструктор копирования
пиши
C++
1
Matrix const& A
или
C++
1
const Matrix& A
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
30.04.2012, 13:11     Приведение типов. #7
Поправил консты. У меня компилируется и запускается. Выводит 4 нуля.
Matrix.h
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
#ifndef Matrix_h__
#define Matrix_h__
#include <iostream>
#include <exception>
using namespace std;
 
class badDim:public exception
{
    virtual const char* what() const throw();
};
class notConv:public exception
{
    virtual const char* what() const throw();
};
class Matrix 
{
protected:
    double** data;
    int m;
    int n;
    void destruct();
public:
    void getMemory(int _m, int _n);
    Matrix();
    Matrix(int m, int n);
    Matrix& operator =(Matrix const& A);
    Matrix& operator =(double a);
    Matrix(Matrix const& A);
    Matrix(double a);
    ~Matrix();
    int getn() const;
    int getm() const;
    double* operator[](int i);
    double const* operator[](int i) const;
    Matrix operator +(Matrix const& A);
    operator double();
};
istream& operator >> (istream& in,Matrix& A);
ostream& operator << (ostream& out,Matrix const& A);
#endif
Matrx.cpp
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
154
155
156
157
#include <cstddef>
#include "Matrix.h"
#include <cmath>
#define eps 1e-6
 
void Matrix::destruct()
{
    for (int i = 0; i < m; i++)
    {
        delete [] data[i];
    }
    delete [] data;
    data = NULL;
}
void Matrix::getMemory(int _m, int _n)
{
    if (data == NULL)
    {
        data = new double*[_m];
        for (int i = 0; i < _m; i++)
        {
            data[i] = new double[_n];
        }
        m = _m;
        n = _n;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                data[i][j] = 0;
    }
    else
    {
        destruct();
        getMemory(_m, _n);
    }
}
Matrix::Matrix()
{
    data = NULL;
    getMemory(1, 1);
    data[0][0] = 0;
}
Matrix::Matrix(int _m, int _n)
{
    data = NULL;
    getMemory(_m, _n);
}
Matrix& Matrix::operator=(Matrix const& A)
{
    getMemory(A.m, A.n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            data[i][j] = A.data[i][j];
    return *this;
}
Matrix& Matrix::operator=(double a)
{
    getMemory(1,1);
    data[0][0] = a;
    return *this;
}
Matrix::Matrix(Matrix const& A)
{
    data = NULL;
    *this = A;  
}
Matrix::Matrix(double a)
{
    data = NULL;
    getMemory(1, 1);
    *this = a;
}
Matrix::~Matrix()
{
    destruct();
}
 
int Matrix::getn() const
{
    return n;
}
int Matrix::getm() const
{
    return m;
}
ostream& operator << (ostream& out,Matrix const& A)
{
    int n = A.getn(), m = A.getm();
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
            out << A[i][j] << '\t';
        out << '\n';
    }
    return out;
}
Matrix Matrix::operator +(Matrix const& A)
{
    if (m != A.m || n != A.n)
        throw badDim();
    Matrix result(m, n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
        {
            result[i][j] = data[i][j]+A[i][j];
        }
    return result;
}
 
istream& operator >> (istream& in, Matrix& A)
{
    int k = 0;
    while (in.good())
    {
        double d;
        in >> d;
        k++;
    }
    in.clear();
    in.seekg(ios::beg);
    int m = 0;
    while (in.good())
    {
        char buf[256];
        in.getline(buf, 255);
        m++;
    }
    int n = k/m;
    in.clear();
    in.seekg(ios::beg);
    A.getMemory(m,n);
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            in>>A[i][j];
    return in;
}
double* Matrix::operator[](int i)
{
    return data[i];
}
double const* Matrix::operator[](int i) const
{
    return data[i];
}
Matrix::operator double()
{
    if(m != 1 || n != 1)
        throw notConv();
    return data[0][0];
}
const char* badDim::what() const throw()
{
    return "Operands have incompatible dimensions.";
}
const char* notConv::what() const throw()
{
    return "Can't convert Matrix to double.";
}
GeneMeister
1 / 1 / 0
Регистрация: 30.04.2012
Сообщений: 7
30.04.2012, 13:15  [ТС]     Приведение типов. #8
Спасибо всем большое!
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
30.04.2012, 13:15     Приведение типов. #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
Поправил консты. У меня компилируется и запускается. Выводит 4 нуля.
ну собственно это программа и должна выводить)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2012, 13:21     Приведение типов.
Еще ссылки по теме:

Приведение типов C++
Приведение типов C++
C++ Приведение типов

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
30.04.2012, 13:21     Приведение типов. #10
Цитата Сообщение от sandye51 Посмотреть сообщение
ну собственно это программа и должна выводить)
Я знаю
Yandex
Объявления
30.04.2012, 13:21     Приведение типов.
Ответ Создать тему
Опции темы

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