Archief - [PROG]C++ Operator overloading probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Daedie

Legacy Member
hier is een link naar mijn code: http://home.euphonynet.be/daedie/matrix.rar

het is een Matrix-object, waarop ik probeer allerhande operaties op te definieren. het (eerste) probleem zit bij de operator+ (en dan logischerwijs ook bij de operator-) functie. In de functie worden alle bewerkingen uitgevoerd zoals ik het wil. maar het programma crasht dan op het moment van: "return hulp" waarbij hulp een object van het type Matrix is, die ik binnen de functie zelf gedefinieerd heb (dit is afaik de normale gang van zaken bij het overloaden van de +operator). Op mijn objecten van Complexe getallen werkt deze manier van werken perfect. En hier niet.

Kan iemand mij helpen?

killgore

Legacy Member
verkeerde ;):


Matrix::Matrix(Matrix &tabel)
{
m_matrix = tabel.m_matrix;
}

je moet de inhoud kopiëren ipv het adres, dit is geen (goede) copy constructor!

Daedie

Legacy Member
heb verbeterd naar:
Code:
Matrix::Matrix(const Matrix &tabel)
{
	for (i = 0; i < m_rijen; i++)
	{
		for (j = 0; j < m_kols; j++)
		{
			m_matrix[i][j] = tabel.m_matrix[i][j];
		}
	}
	
}

maar hetzelfde probleem doet zich nog steeds voor.

killgore

Legacy Member
add:
Code:
Matrix& Matrix::operator=(const Matrix& otherMatrix)
{
	for(i = 0; i < m_rijen; i++)
		delete[] m_matrix[i];
	if(m_rijen>0) delete[] m_matrix; 
	m_rijen = otherMatrix.m_rijen;
	m_rijen = otherMatrix.m_rijen;
	m_kols = otherMatrix.m_kols;
	m_matrix = new double*[m_rijen];
	for (i = 0; i < m_rijen; i++)
		m_matrix[i] = new double[m_kols];
	for (i = 0; i < m_rijen; i++)
	{
		for (j = 0; j < m_kols; j++)
		{
			m_matrix[i][j] = otherMatrix.m_matrix[i][j];
		}
	}
	return *this;
}

en ge moogt wat mooier leren coden :/.

Vich

Legacy Member
Dit gaat een stuk sneller:

Code:
Matrix& Matrix::operator=(const Matrix& otherMatrix)
{
	for(i = 0; i < m_rijen; i++)
		delete[] m_matrix[i];
	if(m_rijen>0) delete[] m_matrix;
	m_rijen = otherMatrix.m_rijen;
	m_rijen = otherMatrix.m_rijen;
	m_kols = otherMatrix.m_kols;
	m_matrix = new double*[m_rijen];
	for (i = 0; i < m_rijen; i++)
		m_matrix[i] = new double[m_kols];
	for (i = 0; i < m_rijen; i++)
	{
		// Kopieer ineens de hele rij(een heel memory block)
		memcpy(m_matrix[i], otherMatrix.m_matrix[i], sizeof(double) * m_kols);
	}
	return *this;
}


Waarom gebruik je trouwens arrays van arrays en niet gewoon 1 grote array? Dat is véél sneller in gebruik!

Dus:
Code:
double* array = new double[rij_grootte * kolom_grootte]
Het element (specifieke_rij, specifieke_kolom) is dan:
Code:
int index = (specifieke_rij * kolom_grootte) + specifieke_kolom;
double element = array[index];
Rekening houdende dat je telt vanaf rij 0, dan 1, 2, etc.

Als je dan een array kopieert naar een andere, dan kan je gewoon een memcopy doen van de pointer naar je array naar de andere klasse z'n array pointer.

Daedie

Legacy Member
vich, dat was een voorwaarde van de opgave. Het moest dus op deze manier.

Dit heeft trouwens het probleem niet verholpen. De =operator is niet nodig om een succesvol een +operator te maken, dat doen ze in ons boek ook niet.

Daedie

Legacy Member
Heb het probleem uiteindelijk gevonden. heb het programma een beetje proper herschreven. En dan tot de conclusie gekomen dat de operator= functie toch nodig was.
De reden dat killgore zijn code niet werkte was omdat bij een operator= functie geen returnwaarde nodig is. de eerste parameter is het object zelf, de 2de de meegegeven parameter (otherMatrix) en de aanpassingen worden in het object zelf aangebracht. dus geen return.

Bedankt voor de hulp. Deze thread mag dicht.

killgore

Legacy Member
Mijn code was wel correct, n/o ze, ma buiten dat het efficiënter kon met memcopy was die volledig in orde. Je geeft zelfs best een return waarde, omdat dit toch meestal verwacht wordt van een operator.

Je moet nl. in principe kunnen doen:

A=B=3*C;

Daedie

Legacy Member
nochtans crasht hij met return waarde. Zonder werkt hij wel.

edit: heb net gezien dat ik bij men complexe getallen object ook een return waarde heb gegeven bij de operator= functie. waarom het hier enkel zonder werkt, is mij een raadsel. Ik denk dat ik eens donderdag bij de prof langs ga.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan