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
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
namespace log { struct BasicBuffer : public std::wstreambuf {}; class LineBasicBuffer : public BasicBuffer { std::vector< traits_type::char_type > m_data; public: typedef std::basic_string<traits_type::char_type, traits_type> string_type; public: virtual int_type overflow(int_type c = traits_type::eof()) { if (!traits_type::eq_int_type(c, traits_type::eof())) m_data.push_back(traits_type::to_char_type(c)); else { m_data.push_back(traits_type::to_char_type(traits_type::eof())); on_new_line(&m_data[0]); m_data.clear(); } return traits_type::not_eof(c); } protected: virtual void on_new_line(string_type const& line) = 0; }; class Listener : public std::wstreambuf { std::vector<BasicBuffer*> m_buffers; protected: virtual int_type overflow(int_type c = traits_type::eof()) { if (!traits_type::eq_int_type(c, traits_type::eof())) { const traits_type::char_type x(traits_type::to_char_type(c)); for (std::vector<BasicBuffer*>::const_iterator it(m_buffers.begin()); it != m_buffers.end(); ++it) if (traits_type::eq_int_type((*it)->sputc(x), traits_type::eof())) return traits_type::eof(); } return traits_type::not_eof( c ); } public: void add_listener(BasicBuffer* ptr_buffer) { m_buffers.push_back(ptr_buffer); } }; }; // log |
Ich hab es nur so drin, weil so der Benutzer auch auf die einzellnen Zeichen Zugriff hat. Kommt aber raus, weil eigtl. unnötig.Zitat
o Ich finds unschön bei überschriebenen Methoden nochmal virtual voranzustellen. Das verwirrt mehr als es hilft.
Beim Aufräumen nicht aufgepasst. Ja soll protected sein. Danke!Zitat
o Lass overflow protected
Zitat
o In overflow kannst du dir mindestens eine Zeile sparen! Smile
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
virtual int_type overflow(int_type c = traits_type::eof()) { m_data.push_back(traits_type::to_char_type(c)); if (traits_type::eq_int_type(c, traits_type::eof())) { on_new_line(&m_data[0]); m_data.clear(); } return traits_type::not_eof(c); } |
Ja, aber wie soll ich den sonst nennen Manager? Er Hört ja auf die Log-MessagesZitat
o Der Name der Klasse Listener ist irgendwie fehl leitend
Nja es bietet sich aber an, da er die eingabe in einen Stream (dann schön durch std::wclog.rdbuf(ListenerInstance) machbar) auf mehrere Umleitet. Wie würdest du es machen?Zitat
o Der Listener sollte meiner Meinung nach kein Puffertyp sein. Sondern in die andren Puffer (optional) integriert werden
In konkreta?Zitat
o Das wär eigentlich ein wunderbares Einsatzgebiet für Policybased Design.
Zitat von »"Deviloper"«
[...]so oder wie meinst de?
Zitat von »"Deviloper"«
Ja, aber wie soll ich den sonst nennen Manager? Er Hört ja auf die Log-Messages
Zitat von »"Deviloper"«
Nja es bietet sich aber an, da er die eingabe in einen Stream (dann schön durch std::wclog.rdbuf(ListenerInstance) machbar) auf mehrere Umleitet. Wie würdest du es machen?
Zitat von »"Deviloper"«
In konkreta?
Werbeanzeige