Operator Überladung

DuffCola

Mitglied
Hallo.
Ich bin gerade bei einer Klasse von mir mit Operator Überladungen auszustatten.
Jetzt weiß ich nur bei dem Folgenden Punkt nicht weiter:

Code:
class Axe
{
private:
	float axe;
public:
	Axe();
	Axe(float value);
	~Axe();

	bool operator==(const Axe &arg);
	bool operator==(const float arg);

	const Axe &operator+(const Axe &arg);
	const Axe &operator+(const float arg);
};

Eigentlich Funktioniert das ja perfekt, aber ich bekomme es nciht hin, wenn z.B die Situation stattfindet, dass ein float mit der Klasse verglichen wird.
Also:
Code:
float f = 10;
Axe a = Axe(10);

if(f == a)
{
 // ....
}

Dann bekomme ich (eigentlich ja logisch) natürlich ne Fehlermeldung.
Ich meine man müsste das mit einer friend Überladung oder so machen, aber ich komme da auch nach einer Suche nicht wieter.
 
Hi DuffCola

Vorab:
Ich bin grundsätzlich kein Fan von Operatorenüberladung, das sollte nur in wirklich gut überlegten Fällen getan werden. Für jemanden der deinen Code liest sieht das komisch aus:
C++:
if(Axe == float)

Das sehr unintuitiv.

Aber zu deiner Frage, du liegst richtig, du brauchst ja jetzt den operator float == Axe, also:
C++:
class Axe
{
private:
   friend bool operator == (const float& v1, const Axe& axe);
};

bool operator == (const float& v1, const Axe& axe) {
   return axe.axe == v1;
}

Grüsse
Cromon
 
Hi.

In dem Fall (wenn du Instanzen der Klasse Axe um Grunde wie floats behandeln willst), könntest du auch einfach operator float() const für die Klasse definieren, dann kannst du die anderen Operatoren weglassen.
 
deepthroat
Wie meinst du das genau ?
Kannst du mir ein Beispiel Code zeigen?

Und wenn es um basis daten typen geht, ist es doch von der speicherkapasität doch eigentlich ganz egal, ob man eine referenz oder eine Kopie übergibt oder?

Und werden operatoren überladungen jetzt private oder public gemacht ?
Eig. müssten die doch public sein(logischer weise !?)
 
deepthroat
Wie meinst du das genau ?
Kannst du mir ein Beispiel Code zeigen?
C++:
class Axe {
...
   operator float() const { return axe; }
};

    if (3.3f == Axe(22)) ...
Und wenn es um basis daten typen geht, ist es doch von der speicherkapasität doch eigentlich ganz egal, ob man eine referenz oder eine Kopie übergibt oder?
Nicht ganz. Ein bool bzw. char sind 1 Byte groß, ein Zeiger auf einem 64bit System ist in der Regel 8 Byte groß. Unterschied: 1/8.
Und werden operatoren überladungen jetzt private oder public gemacht ?
Eig. müssten die doch public sein(logischer weise !?)
Das kommt doch ganz auf den Einsatz an. Sollen die Operatoren auch außerhalb der Klasse benutzt werden? Normal ja, aber pauschalisieren kann man das nicht.
 
OK vielen Dank!
Was bedeutet eigentlich das const ganz am enede einer Funktion?
Das bedeutet, dass die Funktion den Zustand der Instanz nicht ändert / nicht ändern kann.

C++:
class A {
public:
  void f1() {};
  void f2() const {};
};

const A a;

a.f1(); // Fehler: a ist konstant, man darf keine Methode aufrufen die a ändern *könnte*
a.f2(); // OK
 
Zurück