Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

1

18.04.2010, 05:02

Left bzw Right Shift Operator überldung

Hi Leute ...

nachdem ich jetzt die letzten 3 Stunden damit zu gebracht habe nach einer Lösung zu suchen und nun wirklich mit meinem Latein am Ende bin wende ich mich an euch.
Ich suche nach einer Möglichkeit den Right bzw Leftshift Operator auf folgende Weise zu überladen

C-/C++-Quelltext

1
MyDatatype << STREAM << ...


also ich suche praktisch eine Möglichkeit Streams in einen meiner Datentypen zu streamen und damit zb ein equivalent zu cout zu erstellen. Kennt einer von euch eine Möglichkeit mit der das möglich ist ?

mfg Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

2

18.04.2010, 09:52

Ja. Wobei ich mir nciht ganz sicher bin, was du jetz tun willst:
Deine datentypen von einem Standard-Stream auslesen/in einen schreiben, oder eine eigene Streamklasse schreiben?
für beides gibt es möglichkeiten, wobei ich jetz mal vermute, das du eigene klassen in einen standardstream schreiben/lesen willst, das sähe dann so aus (Deklarationen):

C-/C++-Quelltext

1
2
std::istream& operator >>(std::istream& stream, var_type& wert); //wert aus stream einlesen
std::ostream& operator <<(std::ostream& stream, const var_type& wert); //wert in stream schreiben

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

18.04.2010, 09:55

So:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyDatatype
{
  // ...
};

template<typename T, typename C>
MyDatatype& operator<<(MyDatatype& obj, std::basic_istream<T, C>& stream)
{
  // xyz
  return obj;
}

// ...
int main()
{
  std::ifstream bla("test.txt");
  MyDatatype foo;
  foo << bla;
}


Allgemein überlädt man aber den Operator eher für den Stream!
@D13_Dreinig

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

4

18.04.2010, 12:38

Danke für eure Antworten, das von @David_pb sieht so in etwa aus wie ich mir das vorstelle.

Zum "Sinn" der Sache ... Ich möchte ein Equivalent zu std::cout das im Debug Modus alle Ausgaben in eine TextDatei mit logged ... anderenfalls einfach nur ausgibt.



Eine Frage habe ich noch zu deinem Beispiel @David_pb.

Wenn ich jetzt andere Datentypen rein schreiben möchte (z.b: int, string, etc) muss ich dann jedes mal den Operator erneut überladen ?

Also das auch sowas geht:

C-/C++-Quelltext

1
foo << "Hallo Welt" << 27 << endl;




mfg Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

18.04.2010, 12:47

Achso, ich dacht du willst aus einen Stream in deinen Datentyp lesen (MyDatatype << STREAM << ...). Falls "STREAM" nur ein Platzhalter für allerhand Dinge die in deinem Datentyp landen sollen sein soll dann musst für jeden Typ explizit einen operator<< angeben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
MyDatentyp& operator<<(MyDatentyp& obj, const std::string& str) 
{
  // ...
  return obj;
}

MyDatentyp& operator<<(MyDatentyp& obj, int i) 
{
  // ...
  return obj;
}

// usw..


Allerdings: Wenns dir "nur" ums loggen geht, wieso nimmst du nicht std::ofstream dafür?
@D13_Dreinig

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

6

18.04.2010, 12:53

ja war nur als Platzhelter gedacht. Ok, Danke ... das wird ne Menge spaß :P :D:D

hm ... ich weis nicht ob ich mich da jetzt nicht verdenk ... aber wenn ich ofstream nehme dann muss ich dauernd n Object haben in das ich schreiben kann und er gibt nicht gleichzeitig mit aus. Ich möchte das gelogged und ausgegeben (konsole) wird gleichzeitig.
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

18.04.2010, 13:28

Das Objekt in welches du dauernt "schreibst" brauchst du bei deiner Lösung aber auch. Und du kannst streams ja durchaus auch umleiten.
@D13_Dreinig

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

8

18.04.2010, 13:34

habs n bischen anders gelöst

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class _cout : public TSingelton<_cout> 
{ 
private: static unsigned long long int ctr; 
private: static TLinkedMem<ostream> *m_front; 
private: static TLinkedMem<ostream> *m_pos; 
public: ~_cout() 
{ 

} 
};
_cout& operator << (_cout& ref, int stream) 
{ 
std::cout << stream;
return ref; 
}
_cout& operator << (_cout& ref, const std::string stream) 
{ 
cout << stream;
return ref; 
}
unsigned long long int ctr = 0; 
TLinkedMem<ostream>* _cout::m_front = NULL; 
TLinkedMem<ostream>* _cout::m_pos = NULL; 
#define Cout *(_cout::Instance())


bin noch am rum experimentiern ...
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

Werbeanzeige