[c++] dwuwymiarowa tablica dynamiczna access violation

0

Napisałem taką klasę, do obsługi macierzy dow. rozmiarów:

class Macierz
{
	private:
			int m;
			int n;
	public:
		double** elementy;
		Macierz(int, int);
		~Macierz();
		Macierz operator+ (const Macierz&);
		Macierz operator- (const Macierz&);
		Macierz operator* (double);
		Macierz operator* (const Macierz&);
		double* operator[] (int);
		friend ostream& operator<< (ostream&, Macierz);
		friend istream& operator>> (istream&, Macierz);
};

Macierz::Macierz(int x, int y) :m(x), n(y)
{
	elementy = new double*[m];
	for (int i = 0; i < m; i++) {
		elementy[i] = new double[n];
	}
}

Macierz::~Macierz()
{
	for (int i = 0; i > m; i++) {
		delete[] elementy[i];
	}
	delete[] elementy;
}

Macierz Macierz::operator+ (const Macierz& k)
{
	if (k.m != m || k.n != n) throw "Nieprawidlowa operacja! Rozmiary macierzy sa rozne!";
	Macierz wynik(m, n);
	for(int i = 0; i < m; ++i) {
		for(int j = 0; j < n; ++j) {
			wynik.elementy[i][j] = elementy[i][j] + k.elementy[i][j];
		}
	}
	return wynik;
}

//implementacje reszty operatorow niemal identyczne...

double* Macierz::operator[] (int k)
{
	if (k>=m) throw "Nieprawidlowa operacja! Odwolanie do nieistniejacego elemntu macierzy!";
	return elementy[k];
}

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

istream& operator>> (istream& strumien, Macierz a)
{
	for (int i = 0; i < a.m; i++) {
		for (int j = 0; j < a.n; j++) {
			strumien >> a[i][j];
		}
	}
	return strumien;
}

Używam tej klasy w taki sposób:

int main(int argc, char* argv[])
{
	Macierz pierwsza (3, 3);
	Macierz druga (3,3);
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			pierwsza[i][j]=1;
			druga[i][j]=2;
		}
	}
	Macierz trzecia = pierwsza+druga;
	cout << pierwsza << druga << trzecia;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			cout << trzecia[i][j] << " ";
		}
		cout << endl;
	}
	system("PAUSE");
	return 0;
}

Obiekty tej klasy stworzone ręcznie bez problemu przechodzą przez wszelkie wywołania, natomiast problem pojawia się przy obiektach stworzonych przy pomocy operatorów (jak 'trzecia' w moim programie) Niezależnie jak próbuję się odwołać do jej składników (przez operator<< czy przez operator[]) wywala mi access violation. Kiedy skasuję destruktor, wszystko jest ok.
Używam turbo c++.

0

Brakuje ci konstruktora kopiującego. Napisanie go rozwiąże twój problem.

0

No jasne idiotyczny błąd. ;P Działa dzięki :)

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