![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
что-то я запуталась немного,а где ошибка,кто знает?
Matrix &operator +( const Matrix &R) { Matrix **T; T=new Matrix*[m_width]; for(unsigned i=0;i<m_width;i++) { T[i]=new Matrix[m_height]; for(unsigned j=0;j<m_height;j++) { T[i][j]=m_value[i][j]+R.m_value[i][j]; } } return T[m_width][m_height];??? } |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Во-первых интересно было бы узнать какая ошибка
Во-вторых в приведенно коде не видно объявления переменных m_width и m_height |
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
Не могу почему-то сложить матрицы друг с другом, m_width и m_height равны значениям,которые я ввожу сама в main(),это предусмотрено в конструкторе:
Matrix A(3,4),где 3-это m_width ,а 4-m_height |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
А компилится без проблем?
Возвращаемое значение заявлено как ссылка, а возвращается указатель. Какая конкретно ошибка? Неправильно складывает? |
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
void main()
{ Matrix A(3,3); Matrix B(3,3); Matrix C(3,3); C=A+B;вот сдесь и ошибка - вообще не работает |
|||
|
||||
| TIGERоX |
|
|||
|
начинающий... ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.9.2005 Репутация: нет Всего: 1 |
return T[m_width-1][m_height-1]
Это сообщение отредактировал(а) TIGERоX - 16.12.2006, 22:54 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Не работает или не компилируется?
|
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
компилируется,пока не ввожу в
main() { C=A+B; вот это |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
Natalka, покажи весь код и скажи, что этот перегружаемый оператор должен делать
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
#include "stdafx.h"
#include <ctime> using namespace std; class Matrix { int ** m_value; unsigned m_width,m_height; public: Matrix( unsigned width = 0, unsigned height = 0 ) : m_width(width), m_height(height) { m_value = new int*[m_width]; for ( unsigned i = 0; i < m_width; ++i ) { m_value[i] = new int[m_height]; for ( unsigned j = 0; j< m_height; ++j ) m_value[i][k]=0; } } void Get() { for ( unsigned i = 0; i < m_width; ++i ) { for ( unsigned k = 0; k < m_height; ++k ) { m_value[i][k]=rand()%10+1; cout<<m_value[i][k]<<" "; }cout<<endl; } } Matrix &operator +( const Matrix &R) { Matrix **T; T=new Matrix*[m_width]; for(unsigned i=0;i<m_width;i++) { T[i]=new Matrix[m_height]; for(unsigned j=0;j<m_height;j++) { T[i][j]=m_value[i][j]+R.m_value[i][j]; } } return T[m_width][m_height]; } ~Matrix() { for ( unsigned i = 0; i < m_width; i++ ) delete [] m_value[i]; delete [] m_value; } }; void main() { //srand(time(0)); Matrix A(3,3); Matrix B(3,3); Matrix C(3,3); C=A+B; A.Get(); cout<<endl; B.Get(); cout<<endl; C.Get(); } Я просто должна сложить две матрицы друг с другом |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
Natalka, и присвоить результат третьей =) Равно тоже надо перегружать -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
А зачем столько объектов типа Matrix?
|
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
#include "stdafx.h"
#include <ctime> using namespace std; class Matrix { int ** m_value; unsigned m_width,m_height; public: Matrix( unsigned width = 0, unsigned height = 0 ) : m_width(width), m_height(height) { m_value = new int*[m_width]; for ( unsigned i = 0; i < m_width; ++i ) { m_value[i] = new int[m_height]; for ( unsigned j = 0; j< m_height; ++j ) m_value[i][k]=0; } } void Get() { for ( unsigned i = 0; i < m_width; ++i ) { for ( unsigned k = 0; k < m_height; ++k ) { m_value[i][k]=rand()%10+1; cout<<m_value[i][k]<<" "; }cout<<endl; } } Matrix &operator +( const Matrix &R) { Matrix **T; T=new Matrix*[m_width]; for(unsigned i=0;i<m_width;i++) { T[i]=new Matrix[m_height]; for(unsigned j=0;j<m_height;j++) { T[i][j]=m_value[i][j]+R.m_value[i][j]; } } return T[m_width][m_height]; } Matrix& operator=( const Matrix &matrix ) { if ( this != &matrix ) { for ( unsigned i = 0; i < m_width; i++ ) delete [] m_value[i]; delete [] m_value; m_width = matrix.m_width; m_height = matrix.m_height; m_value = new int*[m_width]; for ( unsigned i = 0; i < m_width; ++i ) { m_value[i] = new int[m_height]; for ( unsigned k = 0; k < m_height; ++k ) m_value[i][k] = matrix.m_value[i][k]; } } return *this; } ~Matrix() { for ( unsigned i = 0; i < m_width; i++ ) delete [] m_value[i]; delete [] m_value; } }; void main() { //srand(time(0)); Matrix A(3,3); Matrix B(3,3); Matrix C(3,3); C=A+B; ------------------------------------//а это разве не третья, равно перегрузила A.Get(); cout<<endl; B.Get(); cout<<endl; C.Get(); } |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 10 Всего: 23 |
Зачем такой большой код
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
Cпасибо,конечно,но мне нужен код с перегруженным оператором и с динамическим массивом
|
|||
|
||||
| Rockie |
|
||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
Natalka, Во-первых, у тебя нет коструктора копирования, это раз. Во-вторых, операторы с двумя операндами (x+y) не могут членами класса, их надо выносить за него(вынес все для читабельности). Если определить оператор присваивания:
и оператор +=
то код оператора сложения обьъектов вырождается в
причем последний всегда возвращает объект _по значению_. По-хорошему, в операторе сложения надо еще вставлять проверку на совпадение столбцов/колонок, ну это уже на твоей совести =) По-хорошему в программе должен быть конструктор с передаваемым значением и методы доступа к элементам матрицы. А то так как в данном случае у тебя все инициалировалось одним и тем же числом в конструкторе, мне для проверки пришлось выносить члены-данные в public и изменять их напрямую:
Этого делать конечно нельзя. Ну и названия наверное - почему-то метод Get занимается распечаткой, логичнее imho назвать по-другому а Get как раз заставить возвращать определенный элемент матрицы. В программе еще много недочетов, я исправил только функциональность.
А, ну и кнопочка Код справа и выше формы для ответа =) -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||||||||
|
|||||||||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
А если сделать так,то ,наверное, будет работать
Matrix operator +( const Matrix &R) { Matrix T(m_height,m_width); for(unsigned i=0;i<m_width;i++) for(unsigned j=0;j<m_height;j++) { T.m_value[i][j]=m_value[i][j]+R.m_value[i][j]; } return T; } |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 10 Всего: 23 |
Я не пойму как class matrix делается массивом классов Matrix
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
apook, класс не может сделаться массивом, это разные понятия. Массив объектов класса Matrix можно создать так:
Чтобы создать массив объектов, нужен конструктор по умолчанию(он есть). -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 10 Всего: 23 |
Почему сей код не работает при matrix B;
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: нет Всего: 14 |
Это сообщение отредактировал(а) ptr - 18.12.2006, 10:27 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
у меня все работает так:
#include "stdafx.h" using namespace std; class matrix { int **m_val; int height; int width; friend matrix operator+ ( matrix &, matrix & ); public: matrix( int a, int b ); void Get(); ~matrix(); }; matrix::matrix( int a, int b ) { height =a; width =b; m_val=new int*[height];//->нужно было поменять местами c этим:height =a;width =b; for( int i=0; i <height; i++ ) { m_val[i] =new int[width]; for( int j=0; j <width; j++ ) m_val[i][j] =0; } } void matrix::Get() { for( int i=0; i <height; i++ ) { for( int j=0; j <width; j++ ) { m_val[i][j] =rand() % 10; printf( "%d ", m_val[i][j] ); putc( '\n', stdout ); } } } matrix::~matrix() { delete [] m_val; } matrix operator+( matrix &arg1, matrix &arg2 ) { matrix result( arg1 ); result =result +arg2; return result; } void main() { //int i, j; matrix A( 5, 5 ); matrix B( 5, 5 ); //<--Abnormal program Termination /* //for( i=0; i <5; i++ ) // for( j=0; j <5; j++ ) // B.m_val[i][j] =rand() % 10;//это не нужно тут писать */ A.Get(); putc( '\n', stdout ); B.Get(); cin.get(); } |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Замечание:
Деструктор неправильный - удалит только указатели на строки (или столбцы - что там как считается - всегда путался) |
|||
|
||||
| Natalka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.12.2006 Где: Днепродзержинск Репутация: нет Всего: нет |
A вот так:
matrix::~matrix() { for ( int i = 0; i < width; i++ ) delete [] m_val[i]; delete [] m_val; } |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Natalka, так вроде нормально
Rockie тебе практически готовый код предложил - у него там вроде все нормально сделано |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 2 Всего: 162 |
||||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 10 Всего: 23 |
Почему так тщательно удалять
ведь массив независимо от его разрядности удаляется одной строкрй delete [] m_val; я так где-то читал -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Rockie |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
JackYF, на самом деле можно определить и как ф-ю друга, и как функцию-член класса, но imho стоит привыкать к первому. Потомучто в первом случае случае (x+y) <=> (y+x), а во втором-нет: msdn, General Rules for Operator Overloading
Ну или Страуструп, проще но то же самое:
Добавлено @ 22:28
так и происходит. каждому new свой delete. В конструкторе выделяется память для массива указателей на int(первый new). Потом под каждый из этих указателей выделяется память для массива int-ов. Таким образом получаем двумерный массив. Соответственно его и удалять надо так же, как создавали. То есть в цикле удаляем память под int-ы, а потом сам массив указателей. Это сообщение отредактировал(а) Rockie - 18.12.2006, 22:30 -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||||||
|
|||||||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 11 Всего: 360 |
Для домашних заданий, курсовых, существует "Центр Помощи".
Тема перенесена! |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |