Probleme mit Operatoren

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Probleme mit Operatoren

Beitrag 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:

Code: Alles auswählen

CON << "Wert : " << 0.5f << CON_Object;
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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Probleme mit Operatoren

Beitrag 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;
   }
};

Code: Alles auswählen

foo_stream nonsense;
nonsense << 42 << 5.f << "42";
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.
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Re: Probleme mit Operatoren

Beitrag 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

Code: Alles auswählen

MyStreamClass CON;
schreiben müssen sondern das Ding global machen. Ich bekomme aber jedesmal ein "undefined reference to" und ich habe keine Lust in jeder Datei

Code: Alles auswählen

extern MyStreamClass CON;
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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Probleme mit Operatoren

Beitrag von Aramis »

Du kannst 'CON' im Header als extern deklarieren und in einer Unit dann definieren.

Code: Alles auswählen

// header
extern foo_stream global;

Code: Alles auswählen

// iwas.cpp
foo_stream global;
Sollte gehen, falls ich das Problem richtig interpretiere.
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Re: Probleme mit Operatoren

Beitrag 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
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Probleme mit Operatoren

Beitrag 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.
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Re: Probleme mit Operatoren

Beitrag von BlueShark »

Awesome,
das hätte ich gar nicht gedacht. Hehe, danke nun hat Papa wieder was zum spielen. :D

Mfg
BS
Antworten