Operatoren

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
codeplex
Beiträge: 6
Registriert: 2. Mai 2012 09:40

Operatoren

Beitrag von codeplex »

Hallo,

in einer Klassendeklaration werden u.a. folgenden "Dinge" deklariert:

Code: Alles auswählen

	class TestKlasse {
		char speicher[200];
	public:
		operator const char* () const { return speicher; }
		char& operator [] (int pos) { return speicher[pos]; }
		char* operator + (int pos) { return speicher+ pos; }
Später im Code wird die Klasse/Objekt in einer switch abfrage ausgewertet und mit folgendem Code aufgerufen

Code: Alles auswählen

switch (TestKlasse[pIdent])
Ich kann mir diesen Aufruf einfach noch nicht erklären und dies scheint wohl einfach nur ominöses C++ zu sein, ich komme nämlich aus der Delphi/Pascal Ecke. Kann mir jemand diese Art Array-Zugriff erklären, bzw. hängt der mit den obigen Deklarationen zusammen und wenn ja, dann wie?
Ich denk es wird wohl mit

Code: Alles auswählen

char& operator [] (int pos) { return speicher[pos]; }
zusammen hängen denn alle anderen Deklarationen in der Klasse würden noch weniger Sinn derzeit für mich ergeben. :-)
codeplex
Beiträge: 6
Registriert: 2. Mai 2012 09:40

Re: Operatoren

Beitrag von codeplex »

Ah okey, wunderbar dachte ich mir das schon. Gestern war es mir noch völlig unklar, aber heut nach eine Nacht drüber schlafen schaut die ganz Sache schon besser aus. Ein kleiner Forenbeitrag beschleunigt das Verständis dann noch ungemein.

Wie es mit meiner Erfahrung um C++ steht, nuja in einer kleine Auswahl anderer Sprachen bin ich ganz Fit. Ich schätze mal mein Level in C++ ist momentan so das ich mich mit genügend Zeit unfallfrei in der C++ Welt bewegen kann, ein Taxi/Bus oder Rennfahrer bin ich jedoch noch lange nicht :-)

Mit deinem Stichwort komm ich nun schon wieder gut weiter, vielen Dank. Die Überladung des Operators war mir so noch nicht geläufig.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Operatoren

Beitrag von franzf »

Genau, das ist der operator[] - allerdings muss der auf eine Instanz der Klasse TestKlasse aufgerufen werden, so wie du das jetzt dastehen hast, darf es nicht gehen.
Und mit ominösem C++ hat das wenig zu tun. Sind halt Operatoren...
Ein guter Link zum ganzen Themenblock Operatoren überladen gibt es hier, gibt dort auch ein paar Folgeartikel, darfst sie dir gerne selber suchen ;)

Ansonsten noch ein paar kleine Dinge:
* Konvertierungsoperatoren (dein "operator const char*") sollten nach Möglichkeit vermieden werden. Es macht Code auf Dauer unverständlicher, nur für ein wenig Syntactic Sugar, und man kann auch in richtig doofe Fehler laufen...

* ebenso soll der char* operator+ nur schönere (lies: weniger Schreibarbeit) Syntax bieten. Das geht aber auch so:

Code: Alles auswählen

TestKlasse t;
// char* cprt_at = t+3;
char* cprt_at = &t[3];
Genauso überflüssig ist dann natürlich der Konvertierungsoperator:

Code: Alles auswählen

TestKlasse t;
//const  char* cprt_at = t; // siehst du, wie schwer zu erkennen ist, was hier gerade abläuft?
const char* cprt_at = &t[0]; // Macht man genau so auch mit std::vector!
* Statt rohen statischen Arrays sollte man in C++ direkt zu std::array (bzw. boost::array/std::tr1::array, falls man noch kein c++11 hat) greifen. Die machen Range-Checks im Debug-Modus, was das Fehler finden deutlich erleichtert! Für Arrays variabler Länge nimmt man sowieso std::vector bzw. std::string.

* Wenn du der Verständlichkeit wegen die Daten direkt als const char* zurück geben willst (und andere Sachen), mach es über Funktionen - die haben einen Namen, der direkt sagen kann, was passiert, z.B. [c]const char* TestKlasse::data() const[/c]

* Auf const-correctness gehe ichlieber noch nicht ein ;) (Suchen hilft, wenns dich interessiert).
codeplex
Beiträge: 6
Registriert: 2. Mai 2012 09:40

Re: Operatoren

Beitrag von codeplex »

Mein Problem ist halt das ist ein Code der schon vor paar Jahren geschrieben wurde und ich bin nun dabei ihn als Grundlage für eine Weiterentwicklung zu nutzen. http://www.c-plusplus.de/forum/232010 hatte ich gestern schon gefunden nur konnte ich da noch nicht den richtigen Zusammenhang bilden ist aber gut erklärt. Natürlich potenziert sich der Aufwand für mich nun mit meinen kleinen C++-Gundlagen die ich kenne. Ich hoffe ich kann von meinen anderen Programmiersprachenkenntnissen etwas profitieren.

Vielen Dank für deine Anmerkungen. Ich denk ich werd im Code noch auf mehrere "Unstimmigkeiten" treffen.
Antworten