Operator überladen undt const

LukeS

Erfahrenes Mitglied
Hallo zusammen

Ich schreibe gerade eine Klasse für Komplexe Zahlen.
Nun habe ich ein Problem mit dem überladen des Operators + und dem Attribut const:


Code:
// ComplexNumber.h

class ComplexNumber
{
public:
	ComplexNumber(void);
	ComplexNumber(double re, double im = 0);
	~ComplexNumber(void);

	void setComplexNumber(double re, double im);

	const double getImmaginary();
	void setImmaginary(double im);

	const double getReal();
	void setReal(double re);

	const double getArgument();
	void setArgument(double arg);

	const double getNorm();
	void setNorm(double len);

	void setComplex(double re, double im);

	void konjugate();
	
	// operators
	ComplexNumber operator+ (const ComplexNumber& c2);

	// variables

	double immaginary;
	double real;
};

Code:
// ComplexNumber.cpp
#include "ComplexNumber.h"

ComplexNumber::ComplexNumber(void)
{
	real = 0;
	immaginary = 0;
}

ComplexNumber::ComplexNumber(double re, double im)
{
	real = re;
	immaginary = im;
}

ComplexNumber::~ComplexNumber(void)
{
}

...

const double ComplexNumber::getImmaginary()
{
	return immaginary;
}

void ComplexNumber::setImmaginary(double im)
{
	immaginary = im;
}

const double ComplexNumber::getReal()
{
	return real;
}

void ComplexNumber::setReal(double re)
{
	real = re;
}

...

void ComplexNumber::setComplex(double re, double im)
{
	real = re;
	immaginary = im;
}

void ComplexNumber::konjugate()
{
	immaginary = -immaginary;
}


	// operators

ComplexNumber ComplexNumber::operator+ (const ComplexNumber& c2)
{
	return ComplexNumber(real + c2.getReal(), immaginary + c2.getImmaginary());
}

Code:
Kompiler Fehler:
error C2662: 'ComplexNumber::getReal': this-Zeiger kann nicht von 'const ComplexNumber' in 'ComplexNumber &' konvertiert werden
        Durch die Konvertierung gehen Qualifizierer verloren
error C2662: 'ComplexNumber::getImmaginary': this-Zeiger kann nicht von 'const ComplexNumber' in 'ComplexNumber &' konvertiert werden
        Durch die Konvertierung gehen Qualifizierer verloren

Der Kompilerfehler bezieht sich auf die Zeile in der "operator+"-Funktion.

Ich versteh nicht, was ich falsch gemacht habe.


Noch eine Frage zu "const":
Soweit ich mich erinnere, wird in Java const so verwendet:
Code:
double const foo();

Wie verwendet man "const" richtig in C++?
Im Beispiel aus meinem Buch ist es folgendermassen:
Code:
double foo() const;
Mir ist jedoch lieber, wenn das "const" beim Rückgabetyp steht. Geht das in C++?

Gruss LukeS
 
Nein. Ja, doch, es geht, aber es hat eine andere Bedeutung. Je nachdem wo das const steht, bezieht es sich aus etwas anderes.

Wenn das const hinter der Funktion steht, dann bedeutet das, dass sich die Klasse durch den Aufruf der Funktion nicht verändert. Deshalb musst du das const auch bei den gettern hinten dran packen.

Wenn das const vor dem Rückgabetyp steht, bezieht sich das auf den Rückgabewert und du gibst eine const-ante Variable zurück.

Was den Compiler jetzt aber wirklich stört:
Im operator+ wird eine const ComplexNumber Instanz übergeben. Das heisst, du kannst nur auf Funktionen zugreifen, die das Objekt nicht verändern; sprich mit const entsprechend gekennzeichnet sind.
Da getReal aber kein const hinten dran hat, bedeutet das für den Compiler, dass der Funktionsaufruf versucht, das konstante Objekt zu verändern.

Lösung: Das const hinten dran schreiben.
 
Danke für die Antwort!

Noch ne kleine Frage:
Code:
double const foo();
ist gleich wie
Code:
const double foo();

Oder etwa nicht?

Gruss LukeS
 
Hi.
Danke für die Antwort!

Noch ne kleine Frage:
Code:
double const foo();
ist gleich wie
Code:
const double foo();

Oder etwa nicht?

Gruss LukeS
Ja, das bedeutet das Gleiche. Aber bei Zeigern mußt du aufpassen:
C++:
const int* pci; // pointer auf const int
int* const cpi; // const pointer auf int
const int* const cpci; // const pointer auf const int
Gruß
 
Zurück