c++ konwersja

0

Hej. Chciałam zapytać, czy dobrze zdefiniowałam konwersje typu Wektor na Macierz:

class Wektor
{
private:
	unsigned int _n;
	float * _W;

public:
	Wektor(unsigned int n);
	~Wektor();
	void Wczytaj();
	void Wypisz();
	unsigned int Dl();
}; 
class Wektor;

class Macierz 
{
private:
	unsigned int _m;
	unsigned int _n;
	float ** _A;
public:
	static unsigned int ileMacierzy;
	Macierz(unsigned int n, unsigned int m);
	//~Macierz();
	Macierz Transponuj();
	Macierz(Wektor & W);
	Macierz MnozRazySkalar(float skalar);
	Macierz operator+(const Macierz & M1);
	Macierz operator-(const Macierz & M1);
	Macierz operator=(const Macierz & M1);
	Macierz operator*(const Macierz & M2);
	Macierz(const Macierz& M);
	void Wczytaj();
	void Wypisz();
	Macierz ZmienZnak();
	bool JestSymetryczna();
    float NormaMaksimum();
    float NormaFrobeniusa();
};
Macierz::Macierz(Wektor & W)
{
	_n=W.Dl();
	_m=1;
} 

Program kompiluje się bez błędów, ale gdy dochodzi do pomnożenia macierzy przez wektor wszystko się zawiesza i pojawia się komunikat, że wystąpił problem z aplikacją i zostanie ona zamknięta. Nie wiem czym jest to spowodowane. Może ta konwersja nie jest taka jak powinna być?

void WymnozMacierzePrzezWektor(Macierz &M1, Macierz &M2)
{
	int n;
	cout << " Podaj liczba elementow wektora: ";
	cin >> n;

	Wektor W(n);

  	W.Wczytaj();
	cout << endl;
	cout <<  "Wektor: " << endl;
	W.Wypisz();
	cout << endl;	
	char wybor;
	cout << endl;
	cout << "Wymnoz przez wektor macierze: ( 1->M1 / 2->M2 / 3->obie): ";
	cin >> wybor;
	switch (wybor)
	{
		case '1':
			M1 = M1*W; 
			break;
		case '2':
			M2 = M2*W; 
			break;
		case '3':
			M1 = M1*W; 
			M2 = M2*W; 
			break;
		default:
			cout << endl;
			return;
	}
	cout << endl;
	return;
}

Macierz Macierz::operator*(const Macierz & M2)
{
	
	Macierz C(this->_m, M2._n);
	
	if (this->_n != M2._m)
	{
		cout << "Blad: nie mozna wymnozyc obu macierzy - konflikt rozmarow: " << this->_m <<"x"<< this->_n <<" vs "<<  M2._m <<"x" << M2._n << endl;
		exit(1);
	}
	
	float suma;
	for(unsigned int i = 0 ; i < _m ; i++) 
	{
    	for(unsigned int j = 0; j < M2._n; j++)
    	{
    		suma = 0;
    		for (unsigned k = 0; k < _n; k++)
    			suma += _A[i][k] * M2._A[k][j];
    		C._A[i][j] = suma;
    	}
    	
  	}
	cout << "Iloczyn macierzy M1 i M2 wynosi: " << endl;
	cout << endl;
  	C.Wypisz();
	return C;
}
2

Oczywiście że jest źle.

  1. Wektor ma jednowymiarową tablicę float* a Macierz ma u ciebie dwuwymiarową tablicęfloat** więc chyba od razu widać że to nie zadziała?
  2. Takie przypisanie wskaźnika to proszenie sie o guza. Kto potem zwalnia tą pamięć? Bo masz ten sam wskaźnik w dwóch klasach i pewnie każda spróbuje na nim zrobić delete na koniec...
0

Już rozumiem, dzięki;)

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