Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

23.6 Sonstige Operatoren (cast, (), [])

23.6 Sonstige Operatoren (cast, (), [])

Zum Schluss werde ich noch auf ein paar andere Operatoren eingehen, welche man überladen kann, wobei ich nicht auf alle eingehen werde, da ihre Verwendung zum einen mit größter Vorsicht zu genießen sind und zum anderen, sie in der Praxis sehr selten benötigt werden. Andere hingegen sind allerdings sehr nützlich, wie z.B. die Typumwandlungsoperatoren oder die Klammer bzw. Funktionsoperatoren. Dafür modifiziere ich ein letztes mal die Header-Datei wie folgt.

 1
 2
 3
 4
 5
 6
					
		// Typumwandlungen
		operator	float(void) const;

		// Funktionsoperatoren
		void		operator()(int, int) const;
		void		operator[](int) const;
					

Ich fangen zunächst mit der Implementierung für den Typumwandlungsoperator an.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
					
// Typumwandlung //////////////////////////////////////////////////////////////
CInteger::operator float(void) const {
	return (float)this->m_iValue;
} // operator float ///////////////////////////////////////////////////////////
  
// ...

// Ermöglicht wird jetzt z.B. so etwas
CInteger	oObjekt(5);
float		fZahl1			= (float)oObjekt

// oder auch
CInteger*	pZeigerAufObjekt	= new CInteger(5);
float		fZahl2			= (float)*pZeigerAufObjekt;

delete pZeigerAufObjekt;
					

Wie Sie am Beispiel sehr schön erkennen könn, ist es jetzt möglich, die Objekt durch eine Typumwandlung zu jagen. Für jede Umwandlung die gewünscht ist, muss man eine entsprechende Methode implementieren. Aber, warum braucht man dies? Nun, ich habe vorhin Operatoren für die Berechnung von Ausdrücken bereitgestellt, aber einen Fall habe ich dabei unter den Tisch Fallen lassen. Möchte an z.B. berechnen "oA = 5 + oB", dann wird dies der Compiler nicht zulassen. Ein möglicher Ausweg wäre jetzt zu schreiben "oA = 5 + (int)oB". Aber auch das könnte man anders handhaben (z.B. durch einen geeigneten expliziten Kopierkonstruktor, der aus der 5 ein Objekt zaubert oder man macht dies händisch mit "oA = CInteger(5) + oB").

Nun zu den Klammer - oder auch Funktionsoperatoren genannt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
					
// Funktionsoperatoren ////////////////////////////////////////////////////////
void CInteger::operator() (int iValue1, int iValue2) const {
	std::cout << "Es wurde " << iValue1 << " und " << iValue2 << " uebergeben\n";
}

void CInteger::operator[] (int iValue) const {
	std::cout << "Hole z.B. " << iValue << ". Element\n";
} // operator[] ///////////////////////////////////////////////////////////////

// ...

// Ermöglicht wird jetzt z.B. so etwas
CInteger oObjekt(5);

oObjekt(1, 2);
oObjekt[7];

// oder auch
CInteger* pZeigerAufObjekt = new CInteger(5);

(*pZeigerAufObjekt)(1, 2);
(*pZeigerAufObjekt)[7];

delete pZeigerAufObjekt;
					

Mit diesen Operatoren, kann man Objekte wie Funktionen verwenden. Dabei kann man selbst den Rückgabetyp beliebig festlegen und zumindest bei dem Operator mit den runden Klassern, kann man beliebig viele Parameter übergeben. Bei den eckigen Klammen jedoch immer nur ein Parameter. Im Falle meiner Klasse, machen diese Operatoren nicht wirklich viel Sinn, aber stellen Sie sich vor, Sie hätten eine Matrixklasse, die intern ein Array mit Vektoren besitzt. Mit dem "()" Operator könnte man jetzt z.B. den Wert aus dem zweidimensionalen Feld holen und mit dem "[]" Operator einen Vektor, der an übergebenen Index steht. Sicherlich kann man sich für diese Aufgaben auch Get-Methoden entwerfen, die sogar vom Aufbau her identisch wären, aber mit den zwei erwähnten Operatoren, lässt es sich schöner arbeiten. Trotzdem sollten Sie sich genau überlegen, ob Sie einen solchen Mechanismus implementieren wollen oder nicht, denn gerade für Anfänger, ist eine solche Syntax extrem verwirrend und hinzu kommt, dass die Klammeroperatoren, absolut keine Aussage mehr darüber treffen, was sie eigentlich tun.

Zu guter Letzt, möchte ich noch ein paar Worte über die Operatoren verlieren, welche ich in diesem Tutorial unterschlagen habe. Beispielsweise ist es möglich, den Pfeiloperator "->" zu überschreiben. Allerdings kann man sich bei falscher Implementation, so den Zugriff auf ein Objekt verbauen. Des weiteren ist es möglich, "new" und "delete" zu überladen. Letzteres ist aber auch mit aller höchster Vorsicht zu genießen, weil man hier effektiv Einfluss auf die Speicherverwaltung nimmt. Profis benutzen derartige Überladungen, um eine elegante Speicherprotokollierung zu erstellen. Falls Sie mehr dazu wissen wollen, empfehle ich entsprechende Artikel im Internet zu lesen.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012