Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Перегрузка операторов


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


Код


#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;
}


Автор: feodorv 30.9.2013, 05:29
Вы не можете складывать матрицы разной размерности. Отсюда либо проверять в операторе сложения, совпадают ли размерности, либо ввести класс матриц с фиксированной размерностью (тогда и внутренние 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;
...

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

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

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

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

  Matrix w(d + s);

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

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

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

Автор: Lucsor 2.10.2013, 18:26
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)