Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка +, для матриц 
:(
    Опции темы
Maryann
Дата 20.1.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



помогите найти ошибку: 
Код

class matrix
{
    int size; int A[20][20];
    public:
        matrix(){size=1;}
        matrix(int n){size=n;}
        //matrix(int n,int x){size=n; for(int i=0;i<size;i++)A[i][i]=x;}
        ~matrix(){cout<<"destrouctor\n";}
        void vvod();
        void vivod();
        matrix operator+(matrix o2);
};


.....
перегрузка  такая:
Код

matrix matrix::operator+(matrix o2)
{
    matrix temp(size);
        //temp.size=size;
        for (int i=0; i<size;i++)
            for(int j=0;j<size; j++)
            {temp.A[i][j]=A[i][j]+o2.A[i][j];}
    return temp;
}

PM MAIL   Вверх
JackYF
Дата 20.1.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Maryann @  20.1.2008,  13:51 Найти цитируемый пост)
помогите найти ошибку: 

ошибка-то в чём? опять телепатов вызывать?




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Maryann
Дата 20.1.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Код

void main()
{
     matrix m1(2); m1.vvod();
     matrix m2(2); m2.vvod();
     matrix m3(2); m3=m1+m2;
     m3.vivod();
}


и он выдает такое сообщение: Unhandled Exception 
что неправильно не могу понять. Вроде должно работать?
PM MAIL   Вверх
Ulysses4j
Дата 20.1.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Напишите текст main() по одному оператору в строчке и запустите — должно стать понятно, в какой момент вылетает. Скорей всего дело в вводе-выводе — пиведите код vvod, vivod.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Maryann
Дата 20.1.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Код

void matrix::vvod()
{
    cout<<"Enter chisla matrizi, "<<size*size<<" chisel\n";
    for(int i=0;i<size; i++)
        for(int j=0; j<size;j++)
        {cin>>A[i][j];}
}
void matrix::vivod()
{
    cout<<"matrix: \n";
    for(int i=0;i<size; i++)
        {for(int j=0; j<size;j++) cout<<A[i][j]<<", "; cout<<"\n";}
}


дело в том, что он не выделяет какую-либо ошибку, просто вылетает окно - General Protection Exception 
PM MAIL   Вверх
archimed7592
Дата 20.1.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Maryann, предоставленный Вами код выглядит нормально. А если убрать все строчки из main, то будет GPE?



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Maryann
Дата 20.1.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Если убрать все строчки из main() , никаких ошибок он не выдает
ошибка возникает, только после строчки m3=m1+m2

Это сообщение отредактировал(а) Maryann - 20.1.2008, 15:58
PM MAIL   Вверх
ama_kid
Дата 20.1.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Maryann, а не уничтожается ли объект temp до того, как его значение будет передано в объект m3?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Ulysses4j
Дата 20.1.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Под MSVC 9.0 все прекрасно работает, исключений нет. Вы от нас ничего не скрываете? ;) Какой компилятор?

Добавлено через 3 минуты и 8 секунд
Цитата
Maryann, а не уничтожается ли объект temp до того, как его значение будет передано в объект m3?

С какой стати? Все чисто: все данные хранятся по значению (длина, массив int), вызывается по умолчанию сгенерённый копиктор, который их благополучно побайтово копирует.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Maryann
Дата 20.1.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



ama_kid, возможно, и что же теперь делать? 
PM MAIL   Вверх
ama_kid
Дата 20.1.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Maryann, ну для начала упомянуть компилятор\среду разработки, потому как у меня на MSVC++ 2005 тоже все отлично проглатывается без GPE


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Maryann
Дата 20.1.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



ama_kid, Borland C++, version 4.5 copyright 1991, 1994

Добавлено через 13 минут и 43 секунды
Только что написала то же самое для векторов - заработало!!!  smile Странно, что не работает для матриц
PM MAIL   Вверх
archimed7592
Дата 20.1.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Maryann @  20.1.2008,  16:57 Найти цитируемый пост)
ama_kid, возможно

Невозможно.

Цитата(Maryann @  20.1.2008,  16:57 Найти цитируемый пост)
и что же теперь делать?  

Сменить компилятор(если это позволяют обстоятельства). Советую MinGW или MSVC Express.

Это сообщение отредактировал(а) archimed7592 - 20.1.2008, 17:30


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ulysses4j
Дата 20.1.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Самое странное, что в Borland C++ 3.1 работает... А если вам предложить выбросить этот компилятор в топку и скачать нормальный, вы, конечно же, откажетесь?


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Mayk
Дата 20.1.2008, 17:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Ulysses4j @  20.1.2008,  21:30 Найти цитируемый пост)
Самое странное, что в Borland C++ 3.1 работает... 

не факт. более чем возможно что где-нибудь в не превиденном коде аффтора рушиться память.

Цитата(Maryann @  20.1.2008,  19:46 Найти цитируемый пост)

дело в том, что он не выделяет какую-либо ошибку, просто вылетает окно - General Protection Exception  

Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг
Отладчик мой друг



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Maryann
Дата 20.1.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



У меня есть 4 или 5 разных компиляторов )), но среди них нет такого, который работал бы для всех тем. Вот например с файловой системой - ни один нормально не работает, со списками - не все, приходится уродовать алгоритмы , рекурсию в деревьях они вообще не признают, а в остальном так, средненько. Вот так и живу(. Я уже вообще не верю, что нормальные компиляторы существуют(((
PM MAIL   Вверх
archimed7592
Дата 20.1.2008, 17:55 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Maryann @  20.1.2008,  17:52 Найти цитируемый пост)
но среди них нет такого, который работал бы для всех тем.

Чушь какая-то... Если эти компиляторы начала 90-х(или старше), то совет сменить на современный уже был дан(ты ж не удивляешься, что запорожец не всегда ездит smile). Если речь о современных, то, скорее проблемы в твоих навыках, а не в компиляторах.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 20.1.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Maryann @  20.1.2008,  16:52 Найти цитируемый пост)
Я уже вообще не верю, что нормальные компиляторы существуют((( 

Ужас какой. Как же только люди во всём мире программируют, не задумывалась? smile

mingw, intel'овский, борландовский старше 98-го года, visual-овский старше 2003-го. По-моему, есть из чего выбрать smile

Добавлено через 38 секунд
archimed7592, мысли опять сходятся smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Maryann
Дата 20.1.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Цитата

Если речь о современных, то, скорее проблемы в твоих навыках, а не в компиляторах.


Может быть, но часто бывает так, что на одном компиляторе программа работает, а на другом вылетает вообще. Вот сдам сессию - буду искать нормальный компилятор
PM MAIL   Вверх
archimed7592
Дата 20.1.2008, 19:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Maryann @  20.1.2008,  18:08 Найти цитируемый пост)
Может быть, но часто бывает так, что на одном компиляторе программа работает, а на другом вылетает вообще.

 smile.

Ок, притча о программистах, у которых работает только на одном компиляторе, а на другом программа сыплется.


У меня есть ф-ция, которая меняет местами элементы в массиве. Она принимает указатель на массив и два индекса(тех элементов что нужно местами поменять).
Код

template< typename T >
void mySwap(T *array, std::size_t index1, std::size_t index2) // вот она, эта ф-ция.
{
    // тривиальный swap - можно в одну строку: std::swap(t[index1], t[index2]);
    T temp = t[index1];
    t[index1] = t[index2];
    t[index2] = temp;
}
Теперь, некоторый алгоритм насчитал мне число N, заведомо меньшее размера массива минус 2(N < arraySize - 2), и мне, по логике вещей нужно поменять местами элементы с индексами N и (N + 1). Очевидно, что для этого нужно вызвать ф-цию так: mySwap(myArray, N, N + 1); , но, так уж сложилось, что после этого вызова мне нужно работать с некоторым числом, равным N + 1, причём достаточно интенсивно(т.е. постоянно вычислять N + 1 - неэффективно). Дабы не заводить лишних переменных я решил просто увеличить N на единицу:
Код

mySwap(myArray, N, N + 1);
++N;

Но, т.к. я больно умный, я решил записать это в одну строку:
Код

mySwap(myArray, N, ++N);

Логично? Логично! Читаемо? Безусловно! Лаконично? А то! (подумал я).
Я завершил свой проект, но полгода спустя заказчик потребовал перейти на компилятор X(по каким-то, ведомым одному ему причинам).
Что ж, подумал я, сейчас настроим скрипт сборки на компилятор X и делов то! А не тут-то было... Две недели под отладчиком не принесли результата... Заказчик был недоволен. И т.д. и т.п.

Теперь, внимание, вопрос: Maryann, как ты считаешь, кто, в данной ситуации виноват, компилятор или программист?
Подумай, может не компилятор надо искать, а книгу какую-нибудь толковую, да время найти, чтобы более детально изучить язык? smile 


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ulysses4j
Дата 20.1.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Цитата
кто, в данной ситуации виноват, компилятор или программист?

Конечно... заказчик!  smile 


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
archimed7592
Дата 20.1.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Ulysses4j @  20.1.2008,  19:47 Найти цитируемый пост)
Конечно... заказчик!
Первое правило менеджера: клиент всегда прав smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Lazin
Дата 20.1.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Каким компилятором пользоваться зависит от того - каким компилятором это будут компилировать в универе, одновременно и под старые и под новые заточить код не получится.

PM MAIL Skype GTalk   Вверх
Maryann
Дата 20.1.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Цитата

Теперь, внимание, вопрос: Maryann, как ты считаешь, кто, в данной ситуации виноват, компилятор или программист?

здесь - программист
Цитата

Подумай, может не компилятор надо искать, а книгу какую-нибудь толковую, да время найти, чтобы более детально изучить язык?  

Книга - книгой, изучать язык - это все хорошо. Я, собственно, этим и занимаюсь. Но ведь в том, что моя перегрузка работает неправильно, виноват компилятор? Так что компилятор искать тоже надо.

Добавлено через 4 минуты и 13 секунд
Lazin, у нас в универе такие компиляторы, на которых мало что работает, там очень старые версии) . Поэтому под них никто и не пытается писать)))
PM MAIL   Вверх
Mayk
Дата 20.1.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Maryann @  21.1.2008,  00:03 Найти цитируемый пост)
Но ведь в том, что моя перегрузка работает неправильно, виноват компилятор? 

Вина компилятора не доказана. Полный код в студию. И выполнеяемые действия, приводящие к краху.

Добавлено через 51 секунду
вспомнил пословицу: select isn't broken © кто-то


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 21.1.2008, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Maryann @  20.1.2008,  20:03 Найти цитируемый пост)
Но ведь в том, что моя перегрузка работает неправильно, виноват компилятор?

Уже было сказано, но я повторю: если компилятор допотопный, то виновата ты, посколько выбрала такой компилятор. Если компилятор современный, то скорее всего виновата ты, посколько современные компиляторы и работают одинакого(по Стандарту) и багов в них мало(по крайней мере, наткнутся на них сложно). В конце концов, попробуй как-то более конструктивно обосновать, что виноват именно компилятор и ты увидишь, что он вовсе не виноват smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Cycle
Дата 22.1.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.12.2007

Репутация: 3
Всего: 3



У-у-у-у демагогию развели. На всякий случай напомню какой был код:

Цитата(Maryann @  20.1.2008,  14:51 Найти цитируемый пост)

Код

class matrix
{
    int size; int A[20][20];
    public:
        matrix(){size=1;}
        matrix(int n){size=n;}
        //matrix(int n,int x){size=n; for(int i=0;i<size;i++)A[i][i]=x;}
        ~matrix(){cout<<"destrouctor\n";}
        void vvod();
        void vivod();
        matrix operator+(matrix o2);
};

Код

matrix matrix::operator+(matrix o2)
{
    matrix temp(size);
        //temp.size=size;
        for (int i=0; i<size;i++)
            for(int j=0;j<size; j++)
            {temp.A[i][j]=A[i][j]+o2.A[i][j];}
    return temp;
}



Maryann, если вам ещё актуально для сесии, попробуйте перегрузить оператор =. Может в нем компилятор тупит. Ещё по-моему тут неявно вызывается конструктор копирования, но за второе отвечать не буду.
PM MAIL   Вверх
archimed7592
Дата 22.1.2008, 00:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Cycle @  22.1.2008,  00:01 Найти цитируемый пост)
Может в нем компилятор тупит.

Компилятор редко тупит... Чаще тупят программисты. К примеру, в данном случае, ни ОП, ни КК явно определять не нужно, ибо компилятор обязан определить их и, поверьте, он их определяет.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ulysses4j
Дата 22.1.2008, 01:00 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Цитата(archimed7592 @  22.1.2008,  01:19 Найти цитируемый пост)
компилятор обязан определить их и, поверьте, он их определяет.

Я бы добавил: и в данном случае сгенерированные копиктор и оператор копирующего присваивания корректны. Все-таки меня терзают смутные сомнения, что от нас что-то скрывают... Maryann, вы бы выложили целиком файлы, которые не работают...

Это сообщение отредактировал(а) Ulysses4j - 22.1.2008, 01:01


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Maryann
Дата 23.1.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Цитата

Полный код в студию. И выполнеяемые действия, приводящие к краху.

Цитата

... Maryann, вы бы выложили целиком файлы, которые не работают...

ну вот:
Код

#include<iostream.h>
class matrix
{
     int size; int A[20][20];
     public:
          matrix(){size=1;}
          matrix(int n){size=n;}
          ~matrix(){cout<<"destrouctor\n";}
          void vvod();
          void vivod();
          matrix operator+(matrix o2);
};
void matrix::vvod()
{
    cout<<"Enter "<<size*size<<"chisel \n";
    for(int i=0;i<size ;i++ )
        for(int j=0;j<size;j++)
        cin>>A[i][j];
}
void matrix::vivod()
{
    for(int i=0;i<size ;i++ )
        for(int j=0;j<size;j++)
        cout<<A[i][j];
}
matrix matrix::operator+(matrix o2)
{
     matrix temp(size);
          for (int i=0; i<size;i++)
                {for(int j=0;j<size; j++)
                     temp.A[i][j]=A[i][j]+o2.A[i][j];
                     cout<<"\n";
                }
     return temp;
}

void main()
{
    matrix m1(2); matrix m2(2);
    m1.vvod(); m2.vvod();
    matrix m3(2); m3=m1+m2;
}


Добавлено через 46 секунд
перед m3=m1+m2 - ошибка

Добавлено через 4 минуты и 35 секунд
Цитата

Maryann, если вам ещё актуально для сесии, попробуйте перегрузить оператор =. Может в нем компилятор тупит. 

я его перегрузила так:
Код

matrix matrix::operator=(matrix o2)
{
   for(int i=0;i<size;i++)
      for(int j=0;j<size;j++) A[i][j]=o2.A[i][j];
   return *this;
}


и он тоже не работает(
PM MAIL   Вверх
Mayk
Дата 23.1.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



а как же
Цитата(Maryann @  23.1.2008,  19:29 Найти цитируемый пост)
выполнеяемые действия, приводящие к краху.

?
что вводим,

Добавлено через 10 секунд
????


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Maryann
Дата 23.1.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



целые числа . Например 1 2 3
PM MAIL   Вверх
archimed7592
Дата 23.1.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Maryann @  23.1.2008,  15:29 Найти цитируемый пост)
перед m3=m1+m2 - ошибка

В чём точно заключается ошибка?

Цитата(Maryann @  23.1.2008,  15:29 Найти цитируемый пост)
я его перегрузила так:

Не надо его перегружать!

Цитата(Maryann @  23.1.2008,  15:39 Найти цитируемый пост)
целые числа . Например 1 2 3 

По моим расчётам нужно вводить 8 чисел...



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
warmonger_
Дата 23.1.2008, 16:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



Код

#include<iostream>
using std::cin;
using std::cout;

class matrix
{
     int size; int A[20][20];
     public:
      matrix(int n=1): size(n) { }
          ~matrix(){ }
          void vvod();
          void vivod();
          matrix operator+(const matrix &o2);
};
void matrix::vvod()
{
    cout<<"Enter "<<size*size<<" chisel \n";
    for(int i=0;i<size ;i++ )
        for(int j=0;j<size;j++)
        cin>>A[i][j];
}
void matrix::vivod()
{
    for(int i=0;i<size ;i++ )
        for(int j=0;j<size;j++)
        cout<<A[i][j];
}
matrix matrix::operator+(const matrix &o2)
{
     matrix temp(size);
          for (int i=0; i<size;i++)
                {for(int j=0;j<size; j++)
                     temp.A[i][j]=A[i][j]+o2.A[i][j];
                     cout<<"\n";
                }
     return temp;
}
int main(int argc, char **argv)
{
    matrix m1(2); matrix m2(2);
    m1.vvod(); m2.vvod();
    matrix m3(2); m3=m1+m2;
    m3.vivod();
    cout<<"\n";
    
    return 0;
}





Maryann,  проверил этот код. работает.
вывод:
Код

Enter 4 chisel
1 2 3 4
Enter 4 chisel
4 3 2 1


5555



и должно работать.

Это сообщение отредактировал(а) warmonger_ - 23.1.2008, 16:09
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Maryann
Дата 23.1.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Цитата

В чём точно заключается ошибка?


вылетает сообщение gpe, ничего конкретного не говорится
Цитата

По моим расчётам нужно вводить 8 чисел...


да, 8: 1 2 3 4 1 2 3 4 например.

Добавлено через 1 минуту и 58 секунд
Цитата

Maryann,  проверил этот код. работает.


это хорошо. Хорошо еще, что на экзамене компилировать не надо будет...эх
PM MAIL   Вверх
archimed7592
Дата 23.1.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Maryann, Вы можете назвать компилятор? Уже не в первый раз просим...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
warmonger_
Дата 23.1.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



archimed7592, 
Цитата(Maryann @  20.1.2008,  17:12 Найти цитируемый пост)
Borland C++, version 4.5 copyright 1991, 1994

уже называли...
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
JackYF
Дата 23.1.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(warmonger_ @  23.1.2008,  18:24 Найти цитируемый пост)
version 4.5 copyright 1991, 1994

неужели автору не кажется, что он "малёхо" староват?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
student0511
Дата 20.4.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Вот тоже проблемы, подобного типа, при перегрузки операции + возвращает не готовый элемент, а элемент после удаления. Вот полный код:
Код

#include <iostream>
using namespace std;
////////////////////
class Matrix
{
 private:
     int** MX;
     int n;
     int m;
 public:
     Matrix( ): MX(NULL)
     {}
     Matrix(int N, int M): n(N), m(M)
     {
         MX = new int* [n];
         for(int i = 0; i<n; i++)
             MX[i] = new int[m];
     }
     /////////////////////////////
     void input();
     //////////////
     void show() const;
     //////////////////////////
     Matrix operator=(Matrix M);
     //////////////////////////
         Matrix operator+(Matrix M);
     //////***Destruct***//////
     /*~Matrix()
     {
      for(int i = 0; i<n; i++)
          delete [] *(MX + i);
      delete MX;
     }*/
};
///////////////////////////////////////////////////////
//////////****METHODS***//////////////////////
///////////////////////////////////////////////////////
void Matrix::input ()
{
 for(int i = 0; i<n; i++)
  {
   for(int j = 0; j<m; j++)
      {
       cout<<"MX["<<i<<"]["<<j<<"] = ";
       cin>>MX[i][j];
      }
   cout<<endl;
  }
}
////////////////////////////////////////////
void Matrix::show() const
{
 for(int i = 0; i<n; i++)
    {
     for(int j = 0; j<m; j++)
         cout<<MX[i][j]<<" ";
     cout<<endl;
    }
}
///////////////////////////////////
Matrix Matrix::operator= (Matrix M)
{
 if(&M != this)
    {
     if(M.n == n && M.m == m)
      {
       for(int i = 0; i<n; i++)
          for(int j = 0; j<m; j++)
             *(*(MX + i) + j) = *(*((M.MX)+i)+j);
      }
      else
         cout<<"Wrong size!!!";
     }
 return *this;
}
///////////////////////////////////////////////////
Matrix Matrix::operator+ (Matrix M)
{
 Matrix temp(n, m);
 if(M.n == n && M.m == m)
  {
   for(int i = 0; i<n; i++)
      for(int j = 0; j<m; j++)
         *(*((temp.MX)+ i) + j) = *(*(MX + i) + j) + *(*((M.MX)+i)+j);
  }
  else
     cout<<"Wrong size!!!";
 return temp;
}
///////////////////////////////////////////////////////
int main()
{
 Matrix M1(2,1), M2(2,1), M3;
 
 M1.input();
 M1.show();

 cout<<endl;

 M2.input();
 M2.show();

 M1 = M2;

 cout<<endl;

 M1.show();

 M3 = M1 + M2;

 cout<<endl<<"????"<<endl;
 M3.show();

 cout<<"***";
 return 0;
}

Ошибок не выдаёт, но поля элемента M3 представляет не окончательный вариант, а вот что: 

MX: 0x00000000 -> CXX0030: Error: expression cannot be evaluated
n: -858993460
m: -858993460

Компилятор: Visual C++ 6 1994 - 1998 г. 

А если добавить деструктор, то вообще вылетает с ошибкой. 


PM MAIL   Вверх
vinter
Дата 20.4.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



конструктор копирования определи. А вообще лучше определить в класе операции тип *=, где * это тип операции, и определить свободные ф-ии где эти операторы и будут вызваться. Но конструктор копирования в данном случае все равно необходим.


--------------------
Мой блог
PM MAIL WWW   Вверх
student0511
Дата 20.4.2008, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Чё-то я не догнал, а где использовать конструктор копирования? Вот я создаю temp, в последствии его поля заполняются как надо, но когда возвращается значение из функции, результат почему-то исчезает, т.е. он не переходит в M3, почему? Я же объявил конструктор, где выделяется память под необходимое поле (MX). И не очень мне ясно, что вы упомянули о свободных функциях и операциях тип *=, если можно по-подробнее, то очень бы хотелось. Заведомо премного благодарен!

Добавлено через 9 минут и 59 секунд
Ну вот я написал конструктор копирования:
Код

 Matrix(Matrix& mx)
     {
      MX = mx.MX;
      n = mx.n;
      m = mx.m;
     }

но тогда operator= не вызывается, а  в выражении M3 = M1 + M2 вызывается сразу этот самый конструктор, не дав поработать operator+ 'у. 
PM MAIL   Вверх
vinter
Дата 20.4.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



1. когда temp возвращается из ф-ии он копируется, и удаляется. А так как у тебя не переопределен конструктор копирования вызывается конструктор копирования по умолчанию, вследствии чего у тебя копируется указатель, который удаляется при удалении Temp. В результате в объекте который получен из temp содержится кривой указатель, который никуда не указывает.
2. 
Код

class smth
{
     int a, b;
     ......
     smth& operator +=(const smth &rhs)
     {
          a += rhs.a;
          b += rhs.b;
          return *this;
     } 
     
     smth& operator +=(integral_type rhs)
     {
          a += rhs;
          b += rhs;
          return *this;
     } 
     ......
}

smth operator+(const smth &lhs, const smth &rhs)
{
    smth temp(lhs);
    return temp += rhs;
}


вот тебе пример, того, что я имел в виду

Добавлено @ 09:53
Код

 Matrix(Matrix& mx)
     {
         n = mx.n;
         m = mx.m;
       MX = new int*[n];
       for(int i = 0; i<n; i++)
             MX[i] = new int[m];
       for(int i = 0 ; i < n; i++)
           for(int j= 0 ; j < n; j++)
                MX[i][j] = mx.MX[i][j];
                 
     }

вот такой у тнебя должен быть контсруктор копирования.

Это сообщение отредактировал(а) vinter - 20.4.2008, 09:59


--------------------
Мой блог
PM MAIL WWW   Вверх
student0511
Дата 20.4.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Создал я такой конструктор копирования, написал operator+=(Matrix&), переписал соответствующим образом operator+(Matrix& rM), кстати, последний не может иметь более 1 аргументов, комп. ругается на operator+(Matrix& lM, Matrix& rM). Вот что в конечном образом получилось
Конструктор копирования
Код

Matrix(Matrix& mx)
     {
      int i(0), j(0);
      n = mx.n;
      m = mx.m;
      MX = new int*[n];
      for(i = 0; i<n; i++)
          MX[i] = new int[m];
      for(i = 0; i<n; i++)
          for(j = 0; j<m; j++)
              MX[i][j] = (mx.MX)[i][j];
     }

Перегруженный +=
Код

Matrix& Matrix::operator+= (Matrix& M) 
{
 if(M.n == n && M.m == m)
    {
     for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            MX[i][j]+=(M.MX)[i][j];
    }
 return *(this);
}

И наконец-то operator+
Код

Matrix Matrix::operator+ (Matrix& lM)
{
 Matrix temp(*this);
 return (temp += lM);
}

И вот что получается при вызове конструктора копирования в строке  Matrix temp(*this); передается *this уже пустой, т.е.

MX 0xcccccccc -> CXX0030: Error: expression cannot be evaluated
n  -858993460
m -858993460

Вот последнего я что-то не пойму: почему именно так происходит?! 

Я немного ошибся, в конструктор в строчке Matrix temp(*this); копируется всё нормально, но вот когда возвращается результат trmp+=lM, то перед этим вызывается деструктор, который удаляет temp, а в конечный результат уже копируется, судя по всему, удалённый temp, что влечёт вызов конструктора без параметров и получаем M3: MX(NULL), n(0), m(0). Хотя без перегруженного деструктора результат тот же.




Это сообщение отредактировал(а) student0511 - 20.4.2008, 14:15
PM MAIL   Вверх
vinter
Дата 20.4.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(student0511 @  20.4.2008,  13:22 Найти цитируемый пост)
кстати, последний не может иметь более 1 аргументов


Цитата(vinter @  20.4.2008,  01:58 Найти цитируемый пост)
пределить свободные ф-ии

Код

Matrix(const Matrix& mx)

Код

Matrix& Matrix::operator+= (const Matrix& M) 

Код

Matrix Matrix::operator+ (const Matrix& lM)

операцию покажи которую ты выполняешь.


--------------------
Мой блог
PM MAIL WWW   Вверх
student0511
Дата 20.4.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Не не пашет, переделал, а результат остался прежним.
Вот весь текст программы
Код

#include <iostream>
using namespace std;
////////////////////
class Matrix
{
 private:
     int** MX;
     int n;
     int m;
 public:
     /////***Designer***//////////////
     Matrix(Matrix& mx)
     {
      int i(0), j(0);
      n = mx.n;
      m = mx.m;
      MX = new int*[n];
      for(i = 0; i<n; i++)
          MX[i] = new int[m];
      for(i = 0; i<n; i++)
          for(j = 0; j<m; j++)
              MX[i][j] = (mx.MX)[i][j];
     }
     ///////////////////
     Matrix(): MX(NULL), n(0), m(0)
     {}
     Matrix(int N, int M): n(N), m(M)
     {
         MX = new int* [n];
         for(int i = 0; i<n; i++)
             MX[i] = new int[m];
     }
     //////***METHODS***/////////
     void input();
     /////////////
     void show() const;
     //////////////////////////////
     void operator=(const Matrix&);
     //////////////////////////////
     Matrix& operator+=(const Matrix&);
     //////////////////////////////////
     Matrix operator+(const Matrix&);
     //////***Destructor***//////////
     ~Matrix()
     {
      for(int i = 0; i<n; i++)
          delete [] *(MX + i);
      delete MX;
     }
};
///////////////////////////////////////////////////////
//////////****METHODS***///////////////////////////////
///////////////////////////////////////////////////////
void Matrix::input ()
{
 for(int i = 0; i<n; i++)
  {
   for(int j = 0; j<m; j++)
      {
       cout<<"MX["<<i<<"]["<<j<<"] = ";
       cin>>MX[i][j];
      }
   cout<<endl;
  }
}
////////////////////////////////////////////
void Matrix::show() const
{
 for(int i = 0; i<n; i++)
    {
     for(int j = 0; j<m; j++)
         cout<<MX[i][j]<<" ";
     cout<<endl;
    }
}
///////////////////////////////////
void Matrix::operator= (const Matrix& M)
{
 if(&M != this)
    {
     if(M.n == n && M.m == m)
      {
       for(int i = 0; i<n; i++)
          for(int j = 0; j<m; j++)
             *(*(MX + i) + j) = *(*((M.MX)+i)+j);
      }
      else
         cout<<"Wrong size!!!";
     }
}
///////////////////////////////////////////////////
Matrix& Matrix::operator+= (const Matrix& M) 
{
 if(M.n == n && M.m == m)
    {
     for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            MX[i][j]+=(M.MX)[i][j];
    }
 return *(this);
}
//////////////////////////////////////
/*Matrix Matrix::operator+ (Matrix& M)
{
 Matrix temp(n, m);
 if(M.n == n && M.m == m)
  {
   for(int i = 0; i<n; i++)
      for(int j = 0; j<m; j++)
         *(*((temp.MX)+ i) + j) = *(*(MX + i) + j) + *(*((M.MX)+i)+j);
  }
  else
     cout<<"Wrong size!!!";
 
 return temp;
}*/
//////////////////////////////////////////
Matrix Matrix::operator+ (const Matrix& rM)
{
 Matrix temp(*this);
 return (temp += rM);
}
///////////////////////////////////////////////////////
int main()
{
 Matrix M1(2,1), M2(2,1), M3;
 
 M1.input();
 M1.show();

 cout<<endl;

 M2.input();
 M2.show();

 M1 = M2;

 cout<<endl;

 M1.show();

 M3 = (M1 + M2);

 cout<<endl<<"????"<<endl;
 M3.show();

 cout<<"***";
 return 0;
}

Выражение сложение двух объектов: M3 = (M1 + M2); , соответственно.

Это сообщение отредактировал(а) student0511 - 20.4.2008, 14:48
PM MAIL   Вверх
baldina
Дата 20.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Будет работать, если здесь  
Код

Matrix M1(2,1), M2(2,1), M3;

задашь размерность M3:
Код

Matrix M1(2,1), M2(2,1), M3(2,1);


PM MAIL   Вверх
student0511
Дата 20.4.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Ну да, работает, а почему не пашет, если не задавать размер?
PM MAIL   Вверх
vinter
Дата 20.4.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



для этог случая у тебя будет всегда
Код

else
         cout<<"Wrong size!!!";

т.к в дефолтовом конструкторе ты обнуляешь n, m

Добавлено через 2 минуты и 5 секунд
вообще у тебя неправильно написан класс, сам допускаешь возможность NULL указателя при  присваивании, а никак это не проверяешь. Либо проверяй это, либо уберай дефолтовый конструктор в private.


--------------------
Мой блог
PM MAIL WWW   Вверх
student0511
Дата 21.4.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Всё. Исправил. Работает. smile
Вот код 
Код

#include <iostream>
using namespace std;
////////////////////
class Matrix
{
 private:
     int** MX;
     int n;
     int m;
 public:
     /////***Designer***//////////////
     Matrix(Matrix& mx)
     {
      int i(0), j(0);
      n = mx.n;
      m = mx.m;
      MX = new int*[n];
      for(i = 0; i<n; i++)
          MX[i] = new int[m];
      for(i = 0; i<n; i++)
          for(j = 0; j<m; j++)
              MX[i][j] = (mx.MX)[i][j];
     }
     ///////////////////
     Matrix(): MX(NULL), n(0), m(0)
     {}
     Matrix(int N, int M): n(N), m(M)
     {
         MX = new int* [n];
         for(int i = 0; i<n; i++)
             MX[i] = new int[m];
     }
     //////***METHODS***/////////
     void input();
     /////////////
     void show() const;
     ///////////////////////////// 
     void operator=(const Matrix);
     //////////////////////////////
     Matrix operator+=(const Matrix&);
     //////////////////////////////// 
     Matrix operator+(const Matrix);
     ////////////////////////////////
     Matrix operator-=(const Matrix&);
     //////////////////////////////// 
     Matrix operator-(const Matrix);
     //////***Destructor***//////////
     ~Matrix()
     {
      for(int i = 0; i<n; i++)
          delete [] *(MX + i);
      delete MX;
     }
};
///////////////////////////////////////////////////////
//////////****METHODS***///////////////////////////////
///////////////////////////////////////////////////////
void Matrix::input ()
{
 for(int i = 0; i<n; i++)
  {
   for(int j = 0; j<m; j++)
      {
       cout<<"MX["<<i<<"]["<<j<<"] = ";
       cin>>MX[i][j];
      }
   cout<<endl;
  }
}
////////////////////////////////////////////
void Matrix::show() const
{
 for(int i = 0; i<n; i++)
    {
     for(int j = 0; j<m; j++)
         cout<<MX[i][j]<<" ";
     cout<<endl;
    }
}
///////////////////////////////////////
void Matrix::operator= (const Matrix M)
{
 if(!MX)
 {
  n = M.n;
  m = M.m;
  MX = new int* [n];
  for(int i = 0; i<n; i++)
     MX[i] = new int[m];
 }
 if(&M != this)
    {
     if(M.n == n && M.m == m)
      {
       for(int i = 0; i<n; i++)
          for(int j = 0; j<m; j++)
             *(*(MX + i) + j) = *(*((M.MX)+i)+j);
      }
      else
         cout<<"Wrong size!!!";
     }
}
///////////////////////////////////////////////////
Matrix Matrix::operator+= (const Matrix& M) 
{
 if(M.n == n && M.m == m)
    {
     for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            MX[i][j]+=(M.MX)[i][j];
    }
 return *(this);
}
//////////////////////////////////////////
Matrix Matrix::operator-= (const Matrix& M)
{
 if(M.n == n && M.m == m)
    {
     for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            MX[i][j]-=(M.MX)[i][j];
    }
 return *(this);
}
///////////////////////////////////////////
Matrix Matrix::operator+ (const Matrix rM)
{
 Matrix temp(*this);
 return (temp += rM);
}
//////////////////////////////////////////
Matrix Matrix::operator- (const Matrix rM)
{
 Matrix temp(*this);
 return (temp -= rM);
}
///////////////////////////////////////////////////////
int main()
{
 Matrix M1(2,1), M2(2,1), M3;
 
 M1.input();
 M1.show();

 cout<<endl;

 M2.input();
 M2.show();

 M1 = M2;

 cout<<endl;

 M1.show();

 M3 = (M1 + M2);

 cout<<endl<<"????"<<endl;
 M3.show();

 cout<<"***";
 return 0;
}

    Вот только некоторые вопросы остались: а обязательно при создании operator ('+' или '-', '+=' или '-=') результат возвращать по ссылке и передавать, и что это даёт? Хотя убрал ссылки с operator'ов + и - : всё работает вроде как надо, а убрал передачу аргумента по ссылке в += и -=, то уже никак. В чём проблема? И ещё один вопрос: как применить конструктор к указателю this и возможно ли это? А то в operator= лишний код дублируется, хотелось бы так: (*(this))(M.n, M.m), - компиллятор выдает ошибку "error C2064: term does not evaluate to a function". :-( 

Это сообщение отредактировал(а) student0511 - 21.4.2008, 00:30
PM MAIL   Вверх
vinter
Дата 21.4.2008, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



student0511, читай книги.


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1184 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.