Mcierz i Krytyczny błąd

0
#include<iostream>
#include<cmath>

using namespace std;

class macierz
{
	 public:
        macierz(const macierz& m); //konstruktor kopiujacy
		macierz(int x, int y);
		~macierz();
		
		void wypelnij();
		
		int &x() {return _x;}
		int &y() {return _y;}
	const int &x() const {return _x;}
	const int &y() const {return _y;}
		

	

		friend ostream & operator<< (ostream &out, const macierz &m);
		friend macierz operator+(macierz& m1, macierz& m2); // jesli funkcja ma miec dostep do prywatnej skladowej mac, to musi byc zaprzyjazniona
			

	 private:
 	
		int _x; //Wysokosc
	 	int _y; //Szerokosc
 
		double** mac; 
	


};//:}



void macierz::wypelnij()
{
     
	if(mac)
	{	
	double w;
	for(int i=0;i<_x;++i)
	{
		for(int j=0;j<_y;++j)
		{
		cout<<"Wiersz "<< i <<" Kolumna " <<j<<" \n";
			cin>>w;
				mac[i][j]=w;
		}
	}
	
	cout<<"Macierz wypelniona\n";
	
	}
	
	
}


macierz::macierz(const macierz& m) 
{



	macierz nowa(m._x,m._y);
	for(int i=0;i<m._x;i++)
	{
		for(int j=0;j<m._y;j++)
			{
				nowa.mac[i][j]=m.mac[i][j];
			}
		
	}
	cout << nowa;


}

macierz::macierz(int x, int y): _x(x), _y(y)
{

mac = new double* [_x];
	if(!mac)
	{
		cerr<< "Memory Ivalid";
	}
	
		for(int i=0;i<_x;++i)
		{
			mac[i] = new double[_y];
			if(!mac[i])
			cerr<< "Memory Ivalid";
		}

	for(int i=0;i<_x;++i)
	{
		for(int j=0;j<_y;++j)
		{
			mac[i][j] =0;
		}
	}


}

ostream & operator<< (ostream &out, const macierz &m)
{
	for(int i=0;i<m._x;i++)
	{
		for(int j=0;j<m._y;j++)
		{
			out<<m.mac[i][j]<<" ";
		}
		out<<"\n";
	}
	return out;

}

macierz  operator+ (macierz &m1,macierz &m2) 
{
	if(m1.x() == m2.x() && m1.y() == m2.y())
	{
		macierz m3(m1.x(),m2.y());

		for(int i=0;i<m1.x();++i)
		{
			for(int j=0;j<m1.y();++j)
			{
				m3.mac[i][j]=m1.mac[i][j]+m2.mac[i][j];
			}

		}

        
		return m3;
	}
	else 
	cout<<"Macierze musza posiadac taki sam rozmiar";

		

}



macierz::~macierz()
{
	for(int i=0;i<_x;++i)
		delete [] mac[i];
	delete [] mac;
}

int main()
{

macierz A(2,2), B(2,2);
A.wypelnij();
B.wypelnij();

cout<<A<<"\n";
cout<<B<<"\n";
cout<<A+B;


cin.get();

system("PAUSE");
return 0;
}

Przy próbie dodawania macierzy, program się zawiesza. Co moze być tego powodem ?
Czy istnieje możliwość zmiany konstruktora kopiującego w taki sposób by można było zmieniać wartości macierzy m3 ??

0

Spartoliłeś konstruktor kopiujący jak mało kto.

I na przyszłość, znajdź sobie jakiś tutorial "debugging - zrób to sam".

0

Ja by raczej powiedział, że to nie jest problem braku umiejętności posługiwania się debuggerem, ale zupełny brak zrozumienia co właściwie ma robić copy-konstruktor. Ten jego copy-konstruktor to właściwie forget-konstruktor.

0

Można jaśniej ??

macierz::macierz(const macierz& m) 
{


  
	macierz nowa(m.x(),m.y());
	for(int i=0;i<m.x();++i)
	{
		for(int j=0;j<m.y();++j)
			{
				nowa.mac[i][j]=m.mac[i][j];
			}
		
	}
	


}
0
class macierz
{
public:
    macierz(const macierz& m); //konstruktor kopiujacy
    macierz(int x, int y);
    ~macierz();
               
    .... // cała reszta bez zmian

private:
    double** rezerwujPamiec(int x, int y); // ta metoda będzie używana w konstruktorach

private:
    int _x; //Wysokosc
    int _y; //Szerokosc
    double** mac;
};

macierz::macierz(int x, int y): _x(x), _y(y)
{
    mac = rezerwujPamiec(x,y);

    for(int i=0;i<_x;++i)
    {
        for(int j=0;j<_y;++j)
        {
            mac[i][j] =0;
        }
    }
}

macierz::macierz(const macierz& m)
{
    mac = rezerwujPamiec(m._x, m._y);

    for(int i=0;i<m._x;i++)
    {
        for(int j=0;j<m._y;j++)
        {
            mac[i][j]=m.mac[i][j];
        }
               
    }
    cout << *this;
}

Jak ma wyglądać rezerwujPamiec sam się domyśl.

0

Dziękuje!

0

Dobrze myśle mistrzu ?? :-)

double **macierz::rez_pam(int x,int y)
{
       mac = new double* [_x];
       if(!mac)
       {
         cerr<<"Alocation Memory Invalid";      
               }
       for(int i=0;i<_x;++i)
       {
               mac[i] = new double [_y];
               if(!mac[i])
               cerr<<"Alocation Memory Invalid";
       }
       return mac;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1