![]() |
|
Модераторы: Poseidon |
![]()
|
|
| 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. |