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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операторов 
:(
    Опции темы
Lucsor
Дата 29.9.2013, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



нужно создать класс "матрица" и перегрузить операторы >>, <<, +
компилятор ошибок не выдает, матрица вводится-все нормально, но когда хочу вывести ее на экран,он просто пропускает и начинает вводить вторую матрицу. со сложение та же проблема, не выводит результат.


Код


#include "stdafx.h"
#include "conio.h"
#include "iostream"
using namespace std;

class Matrix
{ int n,m; //размеры матрицы
   int **a; // указатель на матрицу
  public:
     Matrix()
     {n=0;
           m=0;}

  Matrix (int r, int e)
   { n=r; m=e;
    a=new int *[n];
    {for (int i=0;i<n; i++)
     a[i]=new int [m];
    for (int j=0;j<m; j++)
    cout <<"vvedite matricy\n";
    {for (int i=0;i<n; i++)
    {for (int j=0;j<m; j++)
    cin >>a[i][j];}
        }
    }
   } 

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

    ~Matrix()
    {for(int i=0;i<n;i++)
     delete  a[i];
         delete  a; }

    Matrix operator +(const Matrix &A)
    {Matrix temp(n,m);
          temp.n=A.n;
          temp.m=A.m;
          for (int i=0; i<temp.n; i++)
        for (int j=0; j<temp.m; j++)
        {
            temp.a[i][j]=a[i][j]+A.a[i][j];
        }
        return temp;}

     friend ostream& operator << (ostream & cout,Matrix &A);
     friend istream& operator >> (istream & cin, Matrix &B);


     int get_n()
    {return n;}

     int get_m()
    {return m;}

     int **get_a()
     {return a;}

};



ostream& operator << ( ostream& cout, Matrix &A) 
{    {for (int i=0;i<A.n;i++) 
    {for(int j=0; j<A.m;j++) 
     cout << A.a[i][j]<<" "; cout<<endl;} }
     return cout;} 


istream &operator>>(istream &cin,Matrix &B)
 {int n,m;
  cout<<"Vvedite n*m:"; cin>>n>>m;
  B.a=new int *[n];
  for (int i=0;i<n;i++)
     {B.a[i]=new int [m];
       for (int j=0;j<m;j++)
           cin>>B.a[i][j];}
       return cin;}


int _tmain(int argc, _TCHAR* argv[])
{    Matrix d;
    Matrix s;
    Matrix w;
    cin>>d;
    cout<<"Matrica 1:"<<endl<<d;
    cin>>s;
    cout<<"Matrica 2:"<<s;
    w=d+s;
    cout<<"d+s"<<w;
    getch();
    return 0;
}


PM MAIL   Вверх
feodorv
Дата 30.9.2013, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Вы не можете складывать матрицы разной размерности. Отсюда либо проверять в операторе сложения, совпадают ли размерности, либо ввести класс матриц с фиксированной размерностью (тогда и внутренние new/delete станут не нужны).


Цитата(Lucsor @  29.9.2013,  21:18 Найти цитируемый пост)
    ~Matrix()
    {for(int i=0;i<n;i++)
     delete  a[i];
         delete  a; }

Опасное высвобождение массивов. Динамические массивы нужно удалять через delete [] ptr.


Цитата(Lucsor @  29.9.2013,  21:18 Найти цитируемый пост)
     Matrix()
     {n=0;
           m=0;}

Указатель на матрицу a не инициализирован.


Цитата(Lucsor @  29.9.2013,  21:18 Найти цитируемый пост)
  Matrix (int r, int e)
   { n=r; m=e;
    a=new int *[n];
    {for (int i=0;i<n; i++)
     a[i]=new int [m];
    for (int j=0;j<m; j++)
    cout <<"vvedite matricy\n";
    {for (int i=0;i<n; i++)
    {for (int j=0;j<m; j++)
    cin >>a[i][j];}
        }
    }
   } 

Это навал операторов со случайно расставленными скобками. И зачем здесь-то вводить матрицу? Особенно это хорошо смотрится с этим:
Цитата(Lucsor @  29.9.2013,  21:18 Найти цитируемый пост)
    Matrix operator +(const Matrix &A)
    {Matrix temp(n,m);
    ....



Цитата(Lucsor @  29.9.2013,  21:18 Найти цитируемый пост)
ostream& operator << ( ostream& cout, Matrix &A) 

Здесь нужен const у ссылки на матрицу.


Цитата(Lucsor @  29.9.2013,  21:18 Найти цитируемый пост)
но когда хочу вывести ее на экран,он просто пропускает

Вы хоть какую-нибудь отладочную информацию выдавали на экран? Ну, например:
Код

ostream& operator << ( ostream& cout, const Matrix& A)
{
  cout << "n = " << A.n << ", m = " << A.m << endl;
...

Удивитесь результатам. Итог: недоделан ввод матрицы.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 30.9.2013, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Да, и отсутствует оператор присваивания
Код
     Matrix& operator = (const Matrix& B);

из-за чего будут неприятности с памятью...

Добавлено @ 06:08
Без него придётся писать что-то вроде:
Код

  Matrix w(d + s);


Это сообщение отредактировал(а) feodorv - 30.9.2013, 09:08


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
vinter
Дата 30.9.2013, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



feodorv, в operator= принято не константную ссылку возвращать.

Это сообщение отредактировал(а) vinter - 30.9.2013, 08:48


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(vinter @  30.9.2013,  09:48 Найти цитируемый пост)
feodorv, в operator= принято не константную ссылку возвращать.

Ок, поправил)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Lucsor
Дата 2.10.2013, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



...

Это сообщение отредактировал(а) Lucsor - 3.10.2013, 20:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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