Перегрузка операторов

 
0
 
C++
ava
Lucsor | 29.09.2013, 21: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;
}

Comments (5)
ava
feodorv | 30.09.2013, 05:29 #
Вы не можете складывать матрицы разной размерности. Отсюда либо проверять в операторе сложения, совпадают ли размерности, либо ввести класс матриц с фиксированной размерностью (тогда и внутренние new/delete станут не нужны).


Цитата (Lucsor @  29.9.2013,  21:18 findReferencedText)
    ~Matrix()
  {for(int i=0;i<n;i++)
   delete  a[i];
    delete  a; }

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


Цитата (Lucsor @  29.9.2013,  21:18 findReferencedText)
  Matrix()
   {n=0;
      m=0;}

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


Цитата (Lucsor @  29.9.2013,  21:18 findReferencedText)
  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 findReferencedText)
    Matrix operator +(const Matrix &A)
  {Matrix temp(n,m);
  ....



Цитата (Lucsor @  29.9.2013,  21:18 findReferencedText)
ostream& operator << ( ostream& cout, Matrix &A) 

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


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

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

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

Удивитесь результатам. Итог: недоделан ввод матрицы.
ava
feodorv | 30.09.2013, 06:05 #
Да, и отсутствует оператор присваивания
    const Matrix &operator= (const Matrix &B);

из-за чего будут неприятности с памятью...
ava
vinter | 30.09.2013, 08:48 #
feodorv, в operator= принято не константную ссылку возвращать.
ava
feodorv | 30.09.2013, 09:05 #
Цитата (vinter @  30.9.2013,  09:48 findReferencedText)
feodorv, в operator= принято не константную ссылку возвращать.

Ок, поправил)))
ava
Lucsor | 02.10.2013, 18:26 #
подправила код, все остальное вроде как нормально работает кроме 2 перегрузок операторов *=(умножения матриц) и - (бинарный), и одной функции транспонирования.





#include "stdafx.h"
#include "conio.h"
#include "iostream"
#include <fstream>
#include <string>

using namespace std;

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

  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++)
          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;
     delete  [] a; }

Matrix& operator *= (const Matrix& ob) // оператор *=
{      for (int i = 0; i < n; i++) 
        for (int j = 0; j <m; j++) 
           {
                 for (int k = 0; k < m; k++)     
                 a[i][j] +=(a[i][k] * ob.a[k][j]); // умножаем строку на столбик
            }
    return *this; }
              
Matrix& operator - (const Matrix& ob) // бинарный -
       {Matrix **P;
        int **b;
        b=new int *[n];
           for (int i = 0; i < n; i++) 
              { b[i]=new int [m];
             for (int j = 0; j < m; j++) 
                 b[i][j] = a[i][j] - ob.a[i][j]; }
        P= new Matrix (b);
        return **P;}

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

     int **get_a()
     {return a;}

     void transponirovanie(int n,int m, Matrix&A);

};


ostream& operator << ( ostream& cout, const Matrix& A)
{  cout << "n = " << A.n << ", m = " << A.m << endl;    
    {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;}


void transponirovanie(int n,int m, Matrix&A)
                       {// Matrix s; 
                     int **b; 
                 int i,j;
                         //cout<<"Vvedite MATRICY:"<<endl; 
                        // cin>>s;
                         b=new int *[m];
                         for (int i=0;i<n;i++)
                          { b[i]=new int [n]; 
                            for (int j=0;j<n;j++)
                            b[j][i]=A.get_a()[i][j];}
                         cout<<"Transp:"<<endl<< b[j][i];}



int _tmain(int argc, _TCHAR* argv[])
{    
    int n,m,u,t;
    cout<<"Vvedite razmer matrici n*m:  ";
    cin>>n>>m; 
Matrix d(n,m);
    cout<<"Matrica d:"<<endl<<d<<endl;

    cout<<"Vvedite matricy T:";
    Matrix T(n,m);
    cout<<"Matrica T:"<<endl<<T;

    Matrix c;
    c=d*T;
    cout<<"c=d*T "<<endl<<c;
        c=d-T;
    cout<<"T-d"<<c<<endl;

       Matrix e(n,m);
void transponirovanie(n,m,e);
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  vinter ava  feodorv   Lucsor
advanced
Submit