C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Seltsames Verhalten bei von ostream abgeleiteter Klasse

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Thorsten Lück
Guest





PostPosted: Wed Nov 19, 2003 2:57 pm    Post subject: Seltsames Verhalten bei von ostream abgeleiteter Klasse Reply with quote



Hallo,

für das Debuggen und loggen wollte ich von ostream eine Klasse ableiten, um
den stream zu splitten:

zum Einen soll als Logfile in ein File geschrieben werden
zum Anderen gleichzeitig auf stdout.

Meine Klasse sieht dabei so aus:

---
#include <fstream>
#include <string>

using namespace std;

class ologstream : public std::ofstream
{
public:
ologstream(){};
ologstream(const char* name) : std::ofstream(name)
{
}
~ologstream()
{
};
public:
template <class T>
ologstream& operator <<(T& x)
{
std::cout << x;
(*((std::ofstream*)this)) << x;
return *this;
}
};

---
Das Testprogramm:

---
#include "log_stream.h"

int main(int argc, char* argv[])
{
int i=0;
ologstream ls("test.txt");
ls << "Hallo" << 'n' << i << std::endl;
return 0;
}

---

Das Programm kompiliert in der obigen Form einwandfrei.
Ändert man jedoch die Zeile 7 in

ls << "Hallo" << i << std::endl;

so dass kein Character mehr ausgegeben wird, gibt es Fehler:

log_test.cpp: In function `int main(int, char**)':
log_test.cpp:12: error: no match for 'operator<<' in '
(+(&ls)->ologstream::operator<<(T&) [with T = const
char[6]]("Hallo"))->ologstream::operator<<(T&) [with T = int]((&i)) <<
std::endl(std::basic_ostream<_CharT, _Traits>&)'
.....

Ich habe es probiert unter
Visual C++ .net / Win2k
g++ (GCC) 3.3.1 / SuSE 9.0

Wo liegt der Fehler?


Danke und Gruß,
--
Thorsten Lück

Für persönliche Antwort bitte Unterstrich aus Mail-Addresse entfernen.
For private response plesae remove underscores from mail-adress.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Wed Nov 19, 2003 4:18 pm    Post subject: Re: Seltsames Verhalten bei von ostream abgeleiteter Klasse Reply with quote



Thorsten Lück schrieb:

Quote:
für das Debuggen und loggen wollte ich von ostream eine Klasse ableiten, um
den stream zu splitten:

zum Einen soll als Logfile in ein File geschrieben werden
zum Anderen gleichzeitig auf stdout.

Wo liegt der Fehler?

Du leitest von »ostream« ab, um dessen Verhalten zu ändern, aber das
geht nicht, weil es keine polymorphe Klasse ist. »streambuf« ist die
polymorphe Schnittstelle.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thorsten Lück
Guest





PostPosted: Wed Nov 19, 2003 5:00 pm    Post subject: Re: Seltsames Verhalten bei von ostream abgeleiteter Klasse Reply with quote



Markus Schaaf wrote:

Quote:
Thorsten Lück schrieb:

für das Debuggen und loggen wollte ich von ostream eine Klasse ableiten,
um den stream zu splitten:

zum Einen soll als Logfile in ein File geschrieben werden
zum Anderen gleichzeitig auf stdout.

Wo liegt der Fehler?

Du leitest von »ostream« ab, um dessen Verhalten zu ändern, aber das
geht nicht, weil es keine polymorphe Klasse ist. »streambuf« ist die
polymorphe Schnittstelle.


Hm, in streambuf (oder filebuf) ist aber der operator "<<" nicht definiert.
Wie kann ich dann - ohne für alle möglichen Typen diesen operator neu zu
definieren - meinen stream aufteilen und sowohl in ein file als auch auf
den stdout streamen?
--
Thorsten Lück

Für persönliche Antwort bitte Unterstrich aus Mail-Addresse entfernen.
For private response please remove underscores from mail-adress.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marcel Müller
Guest





PostPosted: Wed Nov 19, 2003 5:23 pm    Post subject: Re: Seltsames Verhalten bei von ostream abgeleiteter Klasse Reply with quote

Hi,

Thorsten Lück wrote:

Quote:
Hm, in streambuf (oder filebuf) ist aber der operator "<<" nicht definiert.
Wie kann ich dann - ohne für alle möglichen Typen diesen operator neu zu
definieren - meinen stream aufteilen und sowohl in ein file als auch auf
den stdout streamen?

class mystreambuf : public streambuf
{...};

mystreambuf sb;
ostream os(sb); // <---
--
Marcel Müller

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Nov 19, 2003 5:53 pm    Post subject: Re: Seltsames Verhalten bei von ostream abgeleiteter Klasse Reply with quote



Thorsten Lück wrote:
Quote:

Markus Schaaf wrote:

Thorsten Lück schrieb:

für das Debuggen und loggen wollte ich von ostream eine Klasse ableiten,
um den stream zu splitten:

zum Einen soll als Logfile in ein File geschrieben werden
zum Anderen gleichzeitig auf stdout.

Wo liegt der Fehler?

Du leitest von »ostream« ab, um dessen Verhalten zu ändern, aber das
geht nicht, weil es keine polymorphe Klasse ist. »streambuf« ist die
polymorphe Schnittstelle.


Hm, in streambuf (oder filebuf) ist aber der operator "<<" nicht definiert.

Das braucht er auch nicht.

Das stream Objekt sammelt den ganzen Output und uebergibt es dann seinem
streambuf, der die ehrenvolle Aufgabe hat, das gesammelte Machwerk an
das Geraet weiterzuleiten.

Quote:
Wie kann ich dann - ohne für alle möglichen Typen diesen operator neu zu
definieren - meinen stream aufteilen und sowohl in ein file als auch auf
den stdout streamen?

Indem Du dem stream einen neuen streambuf zuweist der genau das macht:
sowohl in ein file als auch nach stdout.

Jedes stream Objekt besitzt einen streambuf. Das ist ganz einfach Teil
der Arbeitsteilung zwischen den beiden:

Der stream ist fuer die Formattierung zustaendig
Der streambuf ist fuer das weiterleiten zustaendig.

Such mal nach Postings von 'Dietmar Kuehl'. Der hat des oefteren in
comp.lang.c++ Beispiele gepostet, was man da so alles treiben kann.
geh auf Google (wohin auch sonst Smile, such in den Gruppen nach
"stream streambuf c++ kuehl"
gleich der erste Link ist ein Volltreffer.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Nov 19, 2003 5:58 pm    Post subject: Re: Seltsames Verhalten bei von ostream abgeleiteter Klasse Reply with quote



Thorsten Lück wrote:
Quote:

Hm, in streambuf (oder filebuf) ist aber der operator "<<" nicht definiert.
Wie kann ich dann - ohne für alle möglichen Typen diesen operator neu zu
definieren - meinen stream aufteilen und sowohl in ein file als auch auf
den stdout streamen?

Geh zu
http://www.google.com

klicke auf 'Groups'

in's Suchfeld gibst Du ein

stream streambuf C++ kuehl

gleich der erste Link ist ein Volltreffer

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.