Operator +

0

Witam, Mam problem z wyświetleniem przeciążenia operatora vectorów dwuwymiarowych (dodawanie macierzy). Program nie wyświetla wyniku tego dodawania

 
class cMatrix
{
	int kolumny;
	int wiersze;
public:
	vector<vector<int>> vec;
	cMatrix operator + (const cMatrix & Macierz);
cMatrix cMatrix::operator+ (const cMatrix & Macierz)
{   
	cMatrix suma(kolumny, wiersze);
	for (int i = 0; i < wiersze; i++)
	{
		vector<int> wiersz_vec;
		for (int j = 0; j < kolumny; j++)
		{
			wiersz_vec.push_back(vec[i][j]+Macierz.vec[i][j]);
		}
		suma.vec.push_back(wiersz_vec);

	}
	return suma;
}
void cMatrix::wyswietl()
{
	for (int i = 0; i < vec.size(); i++)
	{
		for (int j = 0; j < vec[i].size(); j++)
		{
			cout << vec[i][j] <<" ";
		}
		cout << endl;
	}
}
 
 
cMatrix a;
cMatrix b;
		case '7':
			{
				system("cls");
				(a+b).wyswietl();
			}break;
1
  1. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Używaj wyłącznie angielskie nazewnictwo: http://4programmers.net/Forum/1208091
  3. int kolumny; czyżby może być ujemna ilość kolumn? Do celów indeksacji służysize_t lub ewentualnie unsigned
  4. Mało sensowne nazewnictwo jak i, j zamiast y, x lub row, col lub ewentualnie r, c wcześniej czy później się zemści.
  5. Trzymanie ilości wierszy i kolumn mija się z celem kiedy masz vector<vector<int>> vec; a w nim vec.size(); - i to własnie się zemściło
  6. Podejrzewam że konstruktor tworzy już wiersze macierzy, natomiast twój sposób na dodawanie podwaja ilość wierszy
  7. Polecam wyjątek przy różnych rozmiarach, tak czy owak należy to sprawdzić.
  8. Ma sens zacząć od cMatrix suma(cMatrix); a później dodawać w dwóch pętlach suma.vec[y][x]+=vec[y][x];
  9. Polecam również skorzystać z płaskiej reprezentacji wewnętrznej, czyli składowe klasy size_t ColCount; vector<int> vec; aczkolwiek jeżeli mówimy o jakichś sensownych macierzach to element powinien być typu double
0

Ahh, rano poprawię te nazewnictwo, wyjątek też chciałem zrobić potem. Mi się wydaje, że mój kod powinien dobrze dodawać, bo miałem ten sam kod bez przeciążania i było okej. a kompilator wgl nie wyświetla nic, tak jakby suma była pustym vectorem.
Poprawiłem trochę:

cMatrix cMatrix::operator+ (const cMatrix & Macierz)
{   
	cMatrix suma(wiersze, kolumny);
	for (int i = 0; i < vec.size(); i++)
	{
		vector<int> wiersz_vec;
		for (int j = 0; j < vec[i].size(); j++)
		{
			wiersz_vec.push_back(vec[i][j]+Macierz.vec[i][j]);
		}
		suma.vec.push_back(wiersz_vec);
	}
	return suma;
}
 

Znalazłem błąd. Konstruktor kopiujący. Jeśli ma ktoś ochotę mógłby powiedzieć co jest źle z nim, bo mam go praktycznie przepisanego ze stron internetowych.
Wielkie dzięki @_13th_Dragon oczywiście program i tak poprawię stosując się do Pana zaleceń.

 
Matrix (const cMatrix & M);
//---------------------------
cMatrix::cMatrix (const cMatrix & M)
{
	kolumny=M.kolumny;
	wiersze=M.wiersze;
}
0
  1. Używaj w konstruktorach listy inicjalizacyjnej
  2. Zainicjalizuj w konstruktorze wszystkie składowe

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