Operator Overloading MyClass << "input"
-
Hallo,
ich möchte eine Klasse schreiben, deren Instanzen ich per << mit Daten füttern kann, d.h.:myClass << "input"sollte möglich sein.
Ich habe jetzt nach Operator overloading gegoogelt, und ein paar tutorials gefunden, anhand derer ich schon erfolgreich:cout << myClass und cin >> myClasshinkriege, aber wenn ich obigen versuche, kriege ich:
Compare.C:326: error: no match for 'operator<<' in 'myClass<< "bla"'Obwohl ich
ostream& operator<<(ostream& os, myClass& c) { cout <<"hello"; return os; //Always return stream object. }definiert habe. (der im Moment erstmal nur cout machen soll, damit ich sehe, ob er überhaupt aufgerufen wird.
Geht myClass <<"info" einfach nicht?
Grüße,
Thomas
-
Was ist TMDebug?
-
elfstone schrieb:
ostream& operator<<(ostream& os, TMDebug& c) { cout <<os; return os; //Always return stream object. }cout <<os; ???
-
Uh, sorry.. replaced TMDebug with myClass and cout << os with cout << "hello"
-
Was du definiert hast ist der Operator, der als Linkes Argument eien ostream und als rechtes deine Klasse nimmt. Was du aber scheinbar definieren willst, ist ein operator, der als linkes Argument deine Klasse hat und als rechtes z.B. einen const char*.
Den operator könntest du entweder frei oder als Klassenmember definieren, allerdings kommst du damit nicht weit: sobald du etwas anderes darin "ausgeben" möchtest, fehlt wieder ein entsprechender Operator.Lösugn des Problem wäre vermutlich, eine Klasse von ostream abzuleiten und/oder eine weitere Klasse von streambuf abzuleiten, da vermutlich dort erst die Änderungen vorgenommen werden müssen, die deine Klasse von einem ostream uterscheiden.
Evtl. hilft das hier weiter:http://www.angelikalanger.com/Articles/C++Report/IOStreamsDerivation/IOStreamsDerivation.html
sonst google "derive streambuf"
-
elfstone schrieb:
ich möchte eine Klasse schreiben, deren Instanzen ich per << mit Daten füttern kann
Hallo Thomas,
diese Klasse gibt es schon, es ist std::ostream. Du brauchst lediglich einen eigenen Streambuf um die Daten auch aufzunehmen. Das sieht so aus:
#include <streambuf> #include <iostream> class MyBuf : public std::streambuf { protected: virtual int_type overflow( int_type m = traits_type::eof() ) { if( !traits_type::eq_int_type( m, traits_type::eof() ) ) { // hier kommen die Zeichen rein const char c = traits_type::to_char_type( m ); std::cout << c << '|'; // zur Demo mit '|' ausgeben } return traits_type::not_eof( m ); } }; class MyClass : public std::ostream // das ist nur ein Wrapper, der ostream + MyBuf zusamenfasst { public: typedef std::ostream base_type; MyClass() : base_type( &m_sb ) , m_sb() {} private: MyBuf m_sb; }; int main() { MyClass myClass; myClass << "Test: " << 3.14 << std::endl; return 0; }