Mam pewien problem.
Nie wiem dlaczego destruktor macierzy sam się odpala ?
Klasa macierz:
#include "stdafx.h"
#include <iostream>
#include "macierz.h"
#include <cstdlib>
Macierz::Macierz(int Wiersz, int Kolumna)
{
this->Wiersz = Wiersz;
this->Kolumna = Kolumna;
tablica = new int *[Wiersz];
for (int i = 0; i < Wiersz; i++)
{
tablica[i] = new int[Kolumna];
}
}
Macierz::Macierz(int Wiersz, int Kolumna, Macierz *macierz)
{
Macierz(Wiersz, Kolumna);
if ((macierz->Wiersz == Wiersz) && (macierz->Kolumna == Kolumna))
{
for (int i = 0; i < Wiersz; i++)
for (int j = 0; j < Kolumna; j++)
tablica[i][j] = macierz->tablica[i][j];
}
else
{
std::cout << "Nie mozna zainicjalizowac macierzy macierzą o innych rozmiarach" << std::endl;
}
}
Macierz::Macierz(const Macierz & macierz)
{
Wiersz = macierz.Wiersz;
Kolumna = macierz.Kolumna;
tablica = macierz.tablica;
}
int Macierz::get_value(int x, int y)
{
int temp;
if ((Wiersz > x) && (Kolumna > y))
{
temp = tablica[x][y];
}
else
{
std::cout << "Nie ma elementu o tym indeksie w tej macierzy" << std::endl;
return 0;
}
return temp;
}
void Macierz::set_value(int x, int y, int value)
{
if ((Wiersz > x) && (Kolumna > y))
{
tablica[x][y] = value;
}
else
{
std::cout << "Nie ma elementu o tym indeksie - nie mozna tam zapisac wartosci." << std::endl;
}
}
int Macierz::wyznacznik()
{
return det(*this);
}
int Macierz::det(Macierz x)
{
int value = 0;
if (x.Wiersz != x.Kolumna)
{
std::cout << "Nie mozna obliczyc wyznacznika macierzy niekwadratowej!" << std::endl;
return 0;
}
// poniższy kod bedzie procedowany tylko wtedy jak mamy do czynienia z macierza kwadratowa
if ((x.Wiersz == 1) && (x.Kolumna == 1))
{
return x.tablica[0][0];
}
else
{
for (int k = 0; k < x.Kolumna; k++)
{
Macierz *temp = new Macierz(x.Wiersz - 1, x.Kolumna - 1);
for (int i = 1; i < x.Wiersz; i++)
{
for (int j = 0; j < x.Kolumna; j++)
{
if (j < k)
{
temp->set_value(i - 1, j, x.tablica[i][j]);
}
if (j > k)
{
temp->set_value(i - 1, j - 1, x.tablica[i][j]);
}
}
}
if ((k % 2) == 0)
{
value += x.tablica[0][k] * det(*temp);
}
else
{
value -= x.tablica[0][k] * det(*temp);
}
}
return value;
}
}
Macierz::~Macierz()
{
for (int i = 0; i < Wiersz; i++)
{
delete (tablica[i]);
}
delete (tablica);
}
Funkcja główna programu
// MacierzLab.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include "macierz.h"
#include "wektor.h"
using namespace std;
int main()
{
// tworzymy macierz o wymiarach 0..2 i 0..3 (czyli macierz 3x4 elementową)
Macierz * x = new Macierz(3, 3);
x->set_value(0, 0, 1);
x->set_value(0, 1, 2);
x->set_value(0, 2, 3);
x->set_value(1, 0, 2);
x->set_value(1, 1, 3);
x->set_value(1, 2, 4);
x->set_value(2, 0, 1);
x->set_value(2, 1, 0);
x->set_value(2, 2, 1);
cout << "Wyznacznik macierzy x wynosi : " << x->wyznacznik() << endl;
system("PAUSE");
return 0;
}
Cały kod generuje poprawne wyniki w sensie obliczenia wyznacznika macierzy jednakże nie wiem dlaczego ale nie mam żadnej możliwości kontroli wywołania destruktora.
Przez debugowanie ustaliłem że odpala mi się on samoczynnie i to w chwilach gdy odpalić się powinien... ;) jednak proszę mi wyjaśnić dlaczego się tak dzieje jeśli przecież nie używam do tego celu składni :
delete(temp);
nalik