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

24.08.2010, 18:49

Streamen von Templates

Hi Leute,

ich habe mal eine doofe Frage. Gibt es eine Möglichkeit Teplate-Variablen zu Streamen ?

Also sollte dann iwie so aussehn.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<class T> 
class bla 
{ 
... 
} 
... 
bla<int> t; 
cout << t << endl;




ich habe versucht den stream-Operator für meine Klasse zu überladen (was logischerweise nicht das gewünschte Resultat brachte) und ich habe veruscht den Operator Global für ostream und meine Klasse zu überladen wobei er dabei allerdings eine Templateargumentliste will (die ich ihm nicht mit geben kann da ich ja nicht weis welcher Typ es ist).

Ich habe mir schon überlegt iwie mit sizeof() zu arbeiten und es Bitweise mit zu geben allerdings habe ich keine passende Funktion für ostream gefunden die das akzeptiert.

Über eine Antwort würde ich mich freuen.

Gruß 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

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

2

24.08.2010, 18:55


ich habe versucht den stream-Operator für meine Klasse zu überladen (was logischerweise nicht das gewünschte Resultat brachte) und ich habe veruscht den Operator Global für ostream und meine Klasse zu überladen wobei er dabei allerdings eine Templateargumentliste will (die ich ihm nicht mit geben kann da ich ja nicht weis welcher Typ es ist).
Prinzipiell solltest du den operator innerhalb deiner Template-Klasse definieren, dann ist auch der Typ bekannt.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

24.08.2010, 18:58

Zeig mal wie du das versucht hast.

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

4

24.08.2010, 19:03

Hey, danke schonmal für die Antworten. Versuchte habe ich bisher das.

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
25
26
27
28
29
30
31
32
template<class T> 
class BaseType 
{ 
private: T m; 
public: string m_name;public: BaseType(){m_name = "BaseType";}; 
public: BaseType(const T& o){this->m = o;} 
public: BaseType& operator= (const T& o){this->m = o; return BaseType<T>(this->m);} 
public: BaseType& operator= (const BaseType& o){this->m = o.m; return BaseType<T>(this->m);} 
public: BaseType& operator< (const T& o){return this->m < o;} 
public: BaseType& operator< (const BaseType& o){return this->m < o.m;} 
public: BaseType& operator> (const T& o){return this->m > o;} 
public: BaseType& operator> (const BaseType& o){return this->m > o.m;} 
public: bool operator==(const T& o){return this->m == m;} 
public: bool operator==(const BaseType& o){return this->m == o.m;} 
public: BaseType& operator<= (const T& o){return (this->m < o || this == o);} 
public: BaseType& operator<= (const BaseType& o){return (this->m < o.m || this == o);} 
public: BaseType& operator>= (const T& o){return (this->m > o || this == o);} 
public: BaseType& operator>= (const BaseType& o){return (this->m > o.m || this == o);} 
//friend ostream& operator<<(ostream& s, BaseType& t); 
public: string TypeAsText(){return this->m_name;}public: string ValueAsText() 
{ 
stringstream s;s << this->m;return s.str(); 
} 
}; 
// 
//global functions for BaseType 
// 
//template<typename T> 
//ostream& operator<<(ostream& s, BaseType<T>& t) 
//{ 
// return s << t.m; 
//}

und die Überladung in der Klasse sieht relativ konform aus. Lediglich Klassenintern und ohne Zweiten Parameter. Desweitern suche ich noch nach einer Lösung Teplates zu vergleichen ...


EDIT: Hier noch schnell die Passage mit der Überladung Klassenintern. Dabei kommt allerdings der Fehler das keine rechtsseitige Implimentierung gefunden wurde (was ja auch klar is)

C-/C++-Quelltext

1
2
3
4
5
public: ostream& operator << (BaseType& o) 
{
ostream s;
s<<o;return s; 
}


int und float können verglichen werden. Also muss auch etwas wie das gehen.

C-/C++-Quelltext

1
2
3
BaseType<int> i; 
BaseType<float> f; 
if(f == i){...}
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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Zeus« (24.08.2010, 19:13)


FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

5

24.08.2010, 19:56


C-/C++-Quelltext

1
public: ostream& operator << (BaseType& o)


In deiner Implementierung sind gleich zwei Fehler.
Einer davon:

C-/C++-Quelltext

1
ostream& operator << (ostream out&, BaseType& o)

Und das mit den lokalen Variablen ...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

24.08.2010, 20:33

Üblicherweise macht man das in etwa so:

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
template<class T>
class foo
{
public:
    foo ():x (T()) {}

    template<class T>
    friend std::ostream& operator << ( std::ostream& o, const foo<T> f )
    {
        std::cout << f.x << std::endl;
        return o;
    }

private:
    T x;
};

int main() 
{
    foo<int> f;
    std::cout << f;
}



Das was du mit den vielen Vergleichsoperatoren machst sieht böse aus. Das ist übelst redundant und sollte vermieden werden. Üblicherweise definiert man lediglich <= und = und leitet die anderen Operatoren darauf zurück. Dann kannst du auch ganz leicht alles mit nur einer Änderung anpassen. (Das ist btw. auch in etwa die Sichtweise, wie man solche Operationen mathematisch beschreibt).

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

7

24.08.2010, 20:59

Danke für eure Antworten. Ja, das mit den Operatoren überladen ist nicht gnaz das meine ... Aber dafür lernt man ;) ... um besser zu werden :) ...

@Drakon: So in etwa habe ich es ja machen wollen. Nur sind für mich >= und <= in einem Punkt identisch ... also kann ich nicht sagen dass >= immer dann eintrifft wenn nicht <= ... genauso muss ich die Überladung sowohl für die Klasse selber alsauch für den eigentlichen Typen machen. Da ich ja mit meinem Genauso arbeiten können woll wie mit dem S t a n d a r t t y p e n (warum bitte ist das wort zensiert?). Ich stimme dir aber zu das ich es weiter vereinfachen kann und auch werde ;) ... nur da ich das gerade erst zusammenschreib und die Stream-Funktion möchte und das nicht so wollt habe ich die "optimierung" mal hinten angestellt ... (ich weis nicht sehr effizient) ... :P



also danke Leuts

CLOSED
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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

24.08.2010, 21:10

Nur sind für mich >= und <= in einem Punkt identisch ... also kann ich nicht sagen dass >= immer dann eintrifft wenn nicht <= ...

Das ist ja genau die Definition.. <= und >= sind immer bei = beide erfüllt. Darum geht es ja. ;)

Du definierst dann einfach:

Quellcode

1
2
a >= b wenn gilt  NOT(a<=b) OR (a = b)
a > b wenn gilt NOT(a<=b)


Und um die Implementierung für jeweils T zu machen kannst du einfach einen nicht-expliziten Konstruktor schreiben und die Funktionen alle als friend deklarieren und mit 2 Argumenten nehmen. Das macht das ganze dann viel einfacher.

Ich empfehle dir den Artikel hier sehr:
http://www.c-plusplus.de/forum/viewtopic…-is-232010.html

und bei Interesse den hier auch noch:
http://www.c-plusplus.de/forum/viewtopic…-is-240706.html

Ich bezweilfe auch, dass deine Klasse wirklich viel Sinn macht, aber ich ordne das einfach mal als eine Übungsklasse ein, welche du nicht wirklich vorhast zu benutzen. ;)

Das Problem mit den Operatoren ist halt, dass, wenn du einmal ein paar solche hast auch gleich sehr viele andere beachten musst, weil das Verhalten der Klasse sehr schnell unintuitiv wird.

Und den Vergleich von verschiedenen Typen würde ich gar nicht erst implizit machbar machen, sondern wenn überhaupt mit einer benannten Funktion.

//EDIT:
Standard

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

9

24.08.2010, 21:24

Jop, ist im Moment mehr als Übung gedacht. Da ich's in meinem letzten Projekt doch maximal umständlich betrieben habe denke ich ... Jop ;) hab dann auch gesehn was du gemeind hast :whistling: ... habs schlicht übersehn :D:D ... Sorry ... Also Danke :)
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