Seite 1 von 1
Probleme mit Operatoren
Verfasst: 23.04.2009, 16:06
von BlueShark
Moin moin,
ich stecke seit einiger Zeit bei einer Sache vollkommen fest. Ich wollte zu Lernzwecken eine Klasse schreiben, die es ermöglichen sollte verschiedene Datentypen aufzunehmen und zu formatieren, sprich das was auch cout oder cerr machen.
Sprich so sollte das funktionieren:
Dabei habe ich mir folgendes gedacht. CON ist ein Objekt von meiner Basisklasse, wo alles am Ende in einen Buffer geschrieben werden soll. CON_Object ist eine weitere Klasse, die eine Print Funktion enthält, die dann wiederrum alles in das CON schreibt was da drin steht. Nun dachte ich, dass ich einfach den "<<" Operator überlade und gut ist. Jedoch funktioniert das kein Stück und ich komme einfach nicht dahinter, wie ich das umsetzen kann.
Mfg
BS
Re: Probleme mit Operatoren
Verfasst: 23.04.2009, 16:20
von Aramis
Der Trick besteht darin dass der operator<< eine Referenz auf die Streamklasse zurückgeben muss. Dann kann man die <<-Aufrufe beliebig aneinanderreihen.
Code: Alles auswählen
class foo_stream
{
// ...
foo_stream& operator << (int num)
{
append_integer_to_buffer(num);
return *this;
}
foo_stream& operator << (float num)
{
append_float_to_buffer(num);
return *this;
}
foo_stream& operator << (const char* str)
{
append_string_to_buffer(str);
return *this;
}
};
Der Compiler löst auf zu
Code: Alles auswählen
foo_stream nonsense;
((nonsense.operator<<(42)).operator<<(5.f)).operator<<("42");
Und ja, & funktioniert im Markup nicht.
Re: Probleme mit Operatoren
Verfasst: 23.04.2009, 16:53
von BlueShark
Wunderbar es funktioniert. :D
Aber irgendwie ist mir das peinlich, dass ich darauf nicht gekommen bin, ist doch eigentlich ne ganz simple und elegante Sache. Heißen Dank für die Hilfe.
Könntest du mir gleich bei noch einer Sache helfen?
Ich will folgendes schreiben können :
Code: Alles auswählen
#include "MyStreamClass.h" //das ist die Klasse von CON
........
CON << b << a << bla; //irgendwas in die Klasse schieben
Nun will ich aber nicht erst
schreiben müssen sondern das Ding global machen. Ich bekomme aber jedesmal ein "undefined reference to" und ich habe keine Lust in jeder Datei
schreiben zu müssen. Momentan hab ich CON einfach als static deklariert, davon weiß ich auch, dass es funktioniert wie ich es will, aber ich mag das irgendwie nicht. Das selbe gilt für meinen Buffer. Nun stellt sich mir die Frage, ob man das nicht eleganter lösen könnte? Vlt sollte ich den Buffer direkt in MyStreamClass packen, da CON ja eh statisch ist.
Mfg
BS
Re: Probleme mit Operatoren
Verfasst: 23.04.2009, 16:56
von Aramis
Du kannst 'CON' im Header als extern deklarieren und in einer Unit dann definieren.
Sollte gehen, falls ich das Problem richtig interpretiere.
Re: Probleme mit Operatoren
Verfasst: 23.04.2009, 18:17
von BlueShark
Ah jetzt funktionierts. Ich habe das ganze in nen namespace gesteckt und hatte vergessen, dass ich das Objekt natürlich dann auch in diesem instanzieren muss.
vorher :
Code: Alles auswählen
#include "MyStreamClass.h"
using namespace UTILITIES;
Console CON;
und nun ist es richtig :
Code: Alles auswählen
#include "MyStreamClass.h"
namespace UTILITIES{
Console CON;
};
Vielen Dank
BS
Re: Probleme mit Operatoren
Verfasst: 24.04.2009, 13:26
von Biolunar
Sowelche Operatoren sollte man eigentlich immer global machen und nicht klassenspezifisch. Der Vorteil von globalen Funktionen ist, dass ggf. eine implizite konvertierung des rechten Parameters stattfindet. Eine
genauere Erläuterung habe ich auch gefunden.
Re: Probleme mit Operatoren
Verfasst: 24.04.2009, 14:14
von BlueShark
Awesome,
das hätte ich gar nicht gedacht. Hehe, danke nun hat Papa wieder was zum spielen. :D
Mfg
BS