<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[stdin über eigene Bufferklasse umleiten?]]></title><description><![CDATA[<p>Hallo,</p>
<p>inspiriert durch CStolls Artikel über die C++ IO Streams bin ich zurzeit am Implementieren einer eigenen Eventklasse. Ziel ist es, über ein Interface, realisiert durch eine abstrakte Basisklasse, einen Eventhandler anzumelden. Wenn ein Event eintritt (z.B. ein bestimmter Tastendruck), dann soll die von der Basisklasse überladene Funktion der zuvor registierten Klasse aufgerufen werden. Nun möchte ich idealerweise den Standardinput an meine Klasse leiten, die die relevanten Informationen filtert, und sie an std::streambuf wie gewohnt weiterleitet. Aber wie stelle ich das an? Nachfolgend der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;string&gt; 

// Eventinterface
class EventInterface 
{ 
    public: 
        virtual void OnEvent (const std::string &amp;text) = 0; 
}; 

// Über diese Klasse soll der Standardinput geleitet werden:
class EventHandlerCtrl 
{ 
	private: EventInterface *Handler;

    public: 
        void AddEventHandle (EventInterface *Handler) { 
            this-&gt;Handler = Handler;
        } 
		void StartEventMonitor () {
			// Hier soll der Standardinput gefiltert werden, und beim Eintreten eines
			// Events die Funktion der angemeldeten Klasse aufgerufen werden:
			Handler-&gt;OnEvent (&quot;Hallo, aus der Derived Class!&quot;);
		}
}; 

// Die Klasse, die später beim Eventhandler angemeldet wird:
class WorkingClass : public EventInterface 
{ 
	private: EventHandlerCtrl api;

    public: 
		// Diese Funktion soll beim Auftreten eines Events bzw. Tastendrucks aufgerufen werden:
        void OnEvent (const std::string &amp;text) { 
			std::cout &lt;&lt; &quot;The following event has occurred: &quot; &lt;&lt; text &lt;&lt; std::endl; 
        } 
		void RegisterEvent () {
			api.AddEventHandle (this);
			api.StartEventMonitor ();
		}
}; 

int main () 
{ 
    WorkingClass *derive = new WorkingClass; 
	derive-&gt;RegisterEvent ();
}
</code></pre>
<p>Für Literaturquellen, oder jeglichen anderen Hinweisen bin ich euch sehr dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/196352/stdin-über-eigene-bufferklasse-umleiten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 11:35:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196352.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Oct 2007 18:57:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 18:57:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>inspiriert durch CStolls Artikel über die C++ IO Streams bin ich zurzeit am Implementieren einer eigenen Eventklasse. Ziel ist es, über ein Interface, realisiert durch eine abstrakte Basisklasse, einen Eventhandler anzumelden. Wenn ein Event eintritt (z.B. ein bestimmter Tastendruck), dann soll die von der Basisklasse überladene Funktion der zuvor registierten Klasse aufgerufen werden. Nun möchte ich idealerweise den Standardinput an meine Klasse leiten, die die relevanten Informationen filtert, und sie an std::streambuf wie gewohnt weiterleitet. Aber wie stelle ich das an? Nachfolgend der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;string&gt; 

// Eventinterface
class EventInterface 
{ 
    public: 
        virtual void OnEvent (const std::string &amp;text) = 0; 
}; 

// Über diese Klasse soll der Standardinput geleitet werden:
class EventHandlerCtrl 
{ 
	private: EventInterface *Handler;

    public: 
        void AddEventHandle (EventInterface *Handler) { 
            this-&gt;Handler = Handler;
        } 
		void StartEventMonitor () {
			// Hier soll der Standardinput gefiltert werden, und beim Eintreten eines
			// Events die Funktion der angemeldeten Klasse aufgerufen werden:
			Handler-&gt;OnEvent (&quot;Hallo, aus der Derived Class!&quot;);
		}
}; 

// Die Klasse, die später beim Eventhandler angemeldet wird:
class WorkingClass : public EventInterface 
{ 
	private: EventHandlerCtrl api;

    public: 
		// Diese Funktion soll beim Auftreten eines Events bzw. Tastendrucks aufgerufen werden:
        void OnEvent (const std::string &amp;text) { 
			std::cout &lt;&lt; &quot;The following event has occurred: &quot; &lt;&lt; text &lt;&lt; std::endl; 
        } 
		void RegisterEvent () {
			api.AddEventHandle (this);
			api.StartEventMonitor ();
		}
}; 

int main () 
{ 
    WorkingClass *derive = new WorkingClass; 
	derive-&gt;RegisterEvent ();
}
</code></pre>
<p>Für Literaturquellen, oder jeglichen anderen Hinweisen bin ich euch sehr dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393761</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sun, 28 Oct 2007 18:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 19:04:50 GMT]]></title><description><![CDATA[<p>edit: Doch nicht, sorry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393768</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 28 Oct 2007 19:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 19:05:36 GMT]]></title><description><![CDATA[<p>Genau den selben Artikel habe ich mir auch durchgelesen :p Aber mein Ziel ist ja nicht die Datei, sondern meine Klasse (womöglich abgeleitet von streambuf, keine Ahnung, das ist ja meine Frage). Trotzdem thx!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393771</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sun, 28 Oct 2007 19:05:36 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 19:50:27 GMT]]></title><description><![CDATA[<p>Ok, also ich glaube, den stdin-Stream kannst du nicht in was anderes als eine Datei umleiten. Eventuell kannst du aber cin so beeinflussen, dass du die Datenherkunft beeinflussen kannst. Du kannst ja z.B. (dirty, dirty :D)<br />
<code>istream&amp; operator&gt;&gt; ( istream&amp; stream, const string&amp; text )</code> überladen und mit <code>if ( stream == cin )</code> prüfen, ob der Stream auch das cin-Objekt ist. Zwischendurch kannst du den Zielstream umleiten.. Hab mich komisch ausgedrückt, aber verstehst was ich meine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393795</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 28 Oct 2007 19:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 20:09:52 GMT]]></title><description><![CDATA[<p>Das klappt so nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393810</guid><dc:creator><![CDATA[mikey]]></dc:creator><pubDate>Sun, 28 Oct 2007 20:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 20:10:43 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Du kannst ja z.B. (dirty, dirty ) istream&amp; operator&gt;&gt; ( istream&amp; stream, const string&amp; text ) überladen und mit if ( stream == cin ) prüfen, ob der Stream auch das cin-Objekt ist.</p>
</blockquote>
<p>Also entweder ich verstehe dich nicht, oder du verstehst mich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Das kann so nicht klappen, wie du es mir beschrieben hast. Wenn ich den &gt;&gt; Operator überlade, muss ihn der Anwender auch zwangsläufig anwenden, damit meine Klasse überhaupt irgendwelche Eingaben registiert. Und das Objekt kann auch nur immer vom selben Typ meiner Klasse sein (<strong>this</strong>). Oder wie meinst du das? Könntest du mir ein konkretes Codebeispiel schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393813</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sun, 28 Oct 2007 20:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 20:30:06 GMT]]></title><description><![CDATA[<p>Ok, ich schätze mal, ich hab dich falsch verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Naja, hier das hab ich trotzdem grad mal zusammengeschustert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

#define null 0

class StreamReader
{
	public:
		virtual void read( char* buffer, streamsize count ) = 0;
};

static StreamReader* in_stream = null;

void RedirectInput( StreamReader* in=null )
{
	in_stream = in;
}

istream&amp; operator&gt;&gt; ( istream&amp; stream, string&amp; text )
{
	if ( stream == cin &amp;&amp; in_stream)
	{
		text = &quot;&quot;;
		char c = '\0';
		do
		{
			in_stream-&gt;read( &amp;c, 1 );
			if ( c != '\0' )
				text.push_back( c );
		} while ( c != '\0' );
	}
	else
	{
		for ( char c='\0'; c!='\r' &amp;&amp; c!='\n'; cin.read(&amp;c,1) )
			text.push_back( c );
	}
	return stream;
}

class MyDataSender : public StreamReader
{
	public:
		MyDataSender( const string&amp; to_transmit ) : text(to_transmit), done(0)
		{
		}

		virtual void read( char* buffer, streamsize num )
		{
			for ( streamsize i=0; i&lt;num; i++, done++ )
			{
				if ( done &gt;= text.size() )
					buffer[i] = '\0';
				else
					buffer[i] = text[done];
			}
		}

	private:
		size_t done;
		string text;
};

int main()
{
	MyDataSender sender( &quot;Hallo&quot; );

	string text;
	cin &gt;&gt; text;
	cout &lt;&lt; text &lt;&lt; endl;

	RedirectInput( &amp;sender );
	cin &gt;&gt; text;
	cout &lt;&lt; text &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>Dabei müsstest du dann halt die Deklarationen der istream-Überladungen in den Anwenderdateien bekannt machen... Aber wie gesagt, ich hab dich falsch verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393821</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 28 Oct 2007 20:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Sun, 28 Oct 2007 20:52:49 GMT]]></title><description><![CDATA[<p>Nette Technik, habe ich auch noch nie gesehen :p Aber wie du schon gesagt hast, das ist nicht das, was ich versuche. Trotzdem danke ich dir für deine Mühe. Ich stelle mir das ungefähr so vor, wenn man meine Klasse anwendet:</p>
<pre><code class="language-cpp">// Ab hier soll der Input über meine Klasse umgeleitet werden
WorkingClass::StartEventMonitor ();

std::string eingabe;
// Diese Eingabe soll von meiner Klasse registriert werden, so als wäre es also der klasseneigene, überladene &gt;&gt; Operator:
std::cin &gt;&gt; eingabe;
// ...
</code></pre>
<p>Eventuell hat dazu noch jemand eine Idee? Laut CStolls Artikel muss ja sowas mehr oder weniger machbar sein, zumindest stelle ich mir das so vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393833</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sun, 28 Oct 2007 20:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Mon, 29 Oct 2007 10:03:29 GMT]]></title><description><![CDATA[<p>Du brauchst einfach für cin deine eigene Stream-Puffer-Implementierung angeben:</p>
<pre><code class="language-cpp">mystreambuf buf;
cin.rdbuf(buf); // setze den Puffer neu
</code></pre>
<p>Hier ein Link (funktioniert analog auch für cin):<br />
<a href="http://www.josuttis.de/cppbuch/io/redirect.cpp.html" rel="nofollow">http://www.josuttis.de/cppbuch/io/redirect.cpp.html</a></p>
<p>Nun mußt du dir noch die Klasse streambuf anschauen und deine eigene Implementierung erzeugen. (habe dafür leider keinen Link -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393997</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 29 Oct 2007 10:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to stdin über eigene Bufferklasse umleiten? on Mon, 29 Oct 2007 12:50:48 GMT]]></title><description><![CDATA[<p>Hey super, danke Th! Mein Dank gebührt auch Badestrand <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1394091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1394091</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Mon, 29 Oct 2007 12:50:48 GMT</pubDate></item></channel></rss>