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

Anonymous

unregistriert

1

06.06.2004, 14:27

operator <<

Hi,
heute wollte ich für meine Logklasse einen Ausgabeoperator schreiben. Dies hat auch sehr gut geklappt, hier der Code

Quellcode

1
2
3
4
5
6
7
Log & operator<< (Log& out, const std::string &str)
{
    printf ("%s\n", str.c_str());
}

Log log;
log << "funktioniert\n";


ok, soweit so gut, aber jetzt wollte ich das auch für Pointer ermöglichen, dafür habe ich meine Code folgendermaßen angepasst:

Quellcode

1
2
3
4
5
6
7
Log * operator<< (Log* out, const std::string &str)
{
    printf ("%s\n", str.c_str());
}

Log *log = new Log;
log << "geht nicht!\n";


wenn ich dies allerdings kompilieren will, bekomme ich folgende Fehlermeldung:

Quellcode

1
error: invalid operands of types `Log*' and `const char[4]' to binary `operator<<


Ich versteh nicht ganz, warum dieser Code nicht funktioniert und habe trotz Suche nichts diesbezüglich gefunden.

Kann mir jemand einen Tipp geben ?

Bye

Tankian

Frischling

Beiträge: 6

Beruf: Schueler

  • Private Nachricht senden

2

06.06.2004, 14:54

Zitat

error: invalid operands of types `Log*' and `const char[4]' to binary `operator<<


Naja, da du den operator<< nicht für Log* überladen hast, wird der normale binary operator << aufgerufen. Zu dem passen die angegeben Parameter natürlich überhaupt nicht.

Quellcode

1
2
Log* log = new Log;
log->operator<<("müsste gehen");


Schon klar, net das was du willst ^^

Zweite Möglichkeit wär halt die Methode in der Klasse zu überladen.

Quellcode

1
2
3
4
Log& operator<<(Log* out, const std::string& str)
{
    printf("%s\n", str.c_str());
} 


Habs jetzt nicht ausprobiert, müsste aber beides gehen ..

[edit #1]: Sehe grad, das hattest du auch schon .. dann weiß ich aber auch net, was es sein könnte :f

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

3

06.06.2004, 15:14

Wenn Dein erster operator funktioniert und log nen Pointer ist, warum machst Du dann nicht

*log << "test\n";
?
"Games are algorithmic entertainment."

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

4

06.06.2004, 16:02

Hi,

wenn man schon einen >> oder << oder sonst einen Operator macht, sollte man ihn auch richtig machen:

Quellcode

1
2
3
4
5
6
7
8
CLog& CLog::operator<< ( const char* s ) 
{    
   m_clStream.open( m_strFileName.c_str(), std::ios::out | std::ios::app ); 
   m_clStream << s; 
   m_clStream.close(); 

   return (*this);
}


Ein << operator muss immer sich selber zurückgeben! Sonst ist der Sinn eines solchen operators total verfehlt!

vorallem einen Operator mit

Log_Pointer->operator<< ("ba");

aufzurufen ist abartig und verfehlt absolut den Sinn eines Stream-Operators! Stell dir vor, man müsste das mit cout machen, da hätten wir heut noch printf!

http://www.parashift.com/c++-faq-lite/operator-overloading.html << lesen

Tankian

Frischling

Beiträge: 6

Beruf: Schueler

  • Private Nachricht senden

5

06.06.2004, 17:43

log->operator<<(..) .. sollte auch nur ein Scherz sein ..

Da könnte man ja auch gleich normale Methoden verwenden ..

Anonymous

unregistriert

6

06.06.2004, 18:12

ok, danke für die Antworten.

Osram: :rolleyes: Heut wieder Brett vorm Kopp :)
Patrick: Hab leider noch keine Zeit gefunden, den Artikel zu lesen, werde ihn mir aber nachher zu Gemüte ziehen.
Allerdings funktioniert, wenn ich es nach deinem Vorschlag mache, gar nichts mehr. Ich bekomme die Meldungen:

Quellcode

1
error: no match for 'operator<<' in '*cLog << "test"

Bist du dir sicher das die Funktion nur ein Parameter haben soll ?

Nochmal Dank für die Antworten

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

06.06.2004, 20:14

natürlich sollten operatoren nur 1 parameter haben, bzw. ein Template sein.

p.s.: Den Operator hab ich ja auch nicht nach Deinen wünschen angepasst ;) Bischen sollst Du ja auch selber denken :)

8

06.06.2004, 20:45

Tipp: Der andere liegt bereits vor ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige