C++ Macierz jako struktura - konstruktor?

0

Jako, że to mój pierwszy post na tym forum to najpierw się przywitam. Witam wszystkich programistów.
A teraz do sedna, próbuję napisać strukturę obsługującą macierze. Wszystko jakoś idzie, macierz niby się tworzy, błędów i ostrzeżen w kompilacji żadnych nie ma. Problem pojawia się gdy próbuję się odwołać do wartości macierzy. Program się wywala i tyle.
Poniżej zamieszczam kod struktury:

struct matrix
{
	int h;
	int w;
	int **values;
	matrix(int height, int width)
	{
		h = height;
		w = width;
		int **values = new int*[h];
		for (int i = 0; i < h; i++)
		{
			values[i] = new int[w];
			for (int j = 0; j < w; j++)
			{
				values[i][j] = 0;
			}
		}
	}
	matrix(int height, int width, int ** val)
	{
		h = height;
		w = width;
		int **values = new int*[h];
		for (int i = 0; i < h; i++)
		{
			values[i] = new int[w];
			for (int j = 0; j < w; j++)
			{
				values[i][j] = val[i][j];
			}
		}
	}
	matrix operator+(matrix x)
	{
		matrix wynik = matrix(x.h, x.w);
		for (int i = 0; i < x.h; i++)
			for (int j = 0; j < x.w; j++)
				wynik.values[i][j] = this->values[i][j] + x.values[i][j];
		return wynik;
	}
	matrix operator-(matrix x)
	{
		matrix wynik = matrix(x.h, x.w);
		for (int i = 0; i < x.h; i++)
			for (int j = 0; j < x.w; j++)
				wynik.values[i][j] = this->values[i][j] - x.values[i][j];
		return wynik;
	}

};

W tytule napisałem, że jest to błąd konstruktora, bo szczerze mówiąc, nie wiem co innego miało by tu nie działać. I dla przykładu dorzucę jeszcze fragment z main:

	int szer = 3, wys = 3;
	int **tab = new int *[wys];
	for (int i = 0; i < wys; i++)
	{
		tab[i] = new int[szer];
		for (int j = 0; j < szer; j++)
		{
			tab[i][j] = (i + 1)*(j + 1);
		}
	}
	matrix macierz1 = matrix(3, 3, tab);
	cout << macierz1.values[0][0];//Tu sie wszystko psuje :( 

Chętnię wysłucham każdej wskazówki, każda pomoc mile widziana, z góry dziękuję.

0

Mam rozumieć, że mam błąd w tworzeniu dynamicznej tablicy?

1

Najlepiej nie tworzyć tablicy dwuwymiarowej:

class matrix
  {
   private:
   size_t Y,X;
   int *tb;
   ostream &prn(ostream &s)const { for(size_t y=0,i=0;y<Y;++y,s<<endl) for(size_t x=0;x<X;++x,++i) s<<tb[i]; return s; }
   public:
   class error {};
   matrix(size_t Y,size_t X):Y(Y),X(X),tb(new int[Y*X]);
   size_t Ysize()const { return Y; }
   size_t Xsize()const { return X; }
   int *operator[](size_t y) { return tb+y*X; }
   matrix &operator+=(const matrix &m) { if((Y!=m.Y)||(X!=m.X)) throw error(); memcpy(tb,m.tb,Y*X*sizeof(int)); return *this; }
   matrix operator+(const matrix &m)const { matrix tmp(*this); tmp+=m; return tmp; }
   friend ostream &operator<<(ostream &,const matrix &m) { return m.prn(s); }
  };

    matrix m=matrix(3,3);
    for(int y=0;y<m.Ysize();++y) for(int x=0;x<m.Xsize();++x) m[y][x]=(y+1)*(x+1);
    cout<<m<<endl;
0

_13th_Dragon
Twój sposób działa, ale chciałem się sam nauczyć, a nie dostawać gotowca .Nie żebym nie doceniał Twojego wkładu, ale właśnie dlatego szukam odpowiedzi co jest nie tak z moim kodem. No nic, jutro dalej będę myślał, bo dziś już głowa nie ta.
Jeszcze raz dzięki za pomoc, ale chciałbym "naprawić" swój kod (chyba zrobię to na malloc'u :D może to coś zmieni, bo już brak mi pomysłów).

0
matrix macierz1 = matrix(3, 3, tab); // to psuje
_13th_Dragon napisał(a):

Nie zapomnieć o: destruktor, konstruktor kopiujący, operator przypisania.

3
matrix(int height, int width, int ** val)
{
    ....
    int **values = new int*[h];
    ....
}

Tworzysz lokalną zmienną o nazwie values przesłaniając pole klasy o tej samej nazwie i coś z nią robisz, po czym wychodzisz z konstruktora i pole klasy o nazwie values ciągle na nic nie wskazuje. Podobnie z drugim konstruktorem.
Btw wycieki wycieki wycieki.

0

Dobra dzięki za wszystko dziś już to naprawiłem. A destruktora nie robiłem, bo nie lubię robić czegoś do przodu (skoro nawet konstruktor nie działał). Zaraz się zajmę destruktorem, a później tylko template zostaną. Myslę, że sobie poradzę.
Jeszcze raz dzięki za wszystko.

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