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++.