<?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[Pointer innerhalb Klasse auf Memberfunktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe vorweg sehr viel gegoogelt, aber keinen Lösungsansatz gefunden.<br />
Es geht um folgendes:</p>
<p>Ich habe eine Klasse innerhalb der ich zwei Threads starten möchte, die eine der Klassenmethoden aufrufen.</p>
<p>Das ganze sieht wie folgt aus:</p>
<pre><code class="language-cpp">this-&gt;_acceptThread = new Threading::HThread( &amp;this-&gt;_accept, 
												  NULL, 
												  Threading::PREPARED,
												  true                 );
	this-&gt;_receivingThread = new Threading::HThread( &amp;this-&gt;_receiveData),
													 NULL,
													 Threading::PREPARED,
													 true                 );
</code></pre>
<p>Es geht genau um den ersten Parameter. Es wird folgendes erwartet:</p>
<pre><code class="language-cpp">typedef unsigned int (__stdcall *THREAD_ROUTINE)(void*);
</code></pre>
<p>Wie bekomme ich einen Zeiger auf diese Methode? Der Hintergrund ist mir klar. Jede Instanz dieser Klasse bekommt ihre eigenen Methoden. Daher ist es mir ohne Instanz nicht möglich die Adresse der instanzierten Klassenmethode zu bekommen.</p>
<p>Dennoch muss doch die Möglichkeit bestehen, an die Adresse der Instanz zu kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246964/pointer-innerhalb-klasse-auf-memberfunktion</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 04:12:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246964.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2009 11:53:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 11:53:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe vorweg sehr viel gegoogelt, aber keinen Lösungsansatz gefunden.<br />
Es geht um folgendes:</p>
<p>Ich habe eine Klasse innerhalb der ich zwei Threads starten möchte, die eine der Klassenmethoden aufrufen.</p>
<p>Das ganze sieht wie folgt aus:</p>
<pre><code class="language-cpp">this-&gt;_acceptThread = new Threading::HThread( &amp;this-&gt;_accept, 
												  NULL, 
												  Threading::PREPARED,
												  true                 );
	this-&gt;_receivingThread = new Threading::HThread( &amp;this-&gt;_receiveData),
													 NULL,
													 Threading::PREPARED,
													 true                 );
</code></pre>
<p>Es geht genau um den ersten Parameter. Es wird folgendes erwartet:</p>
<pre><code class="language-cpp">typedef unsigned int (__stdcall *THREAD_ROUTINE)(void*);
</code></pre>
<p>Wie bekomme ich einen Zeiger auf diese Methode? Der Hintergrund ist mir klar. Jede Instanz dieser Klasse bekommt ihre eigenen Methoden. Daher ist es mir ohne Instanz nicht möglich die Adresse der instanzierten Klassenmethode zu bekommen.</p>
<p>Dennoch muss doch die Möglichkeit bestehen, an die Adresse der Instanz zu kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755029</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 11:53:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:12:27 GMT]]></title><description><![CDATA[<p>Mach die Thread-Startup-Methoden statisch. Soweit ich weiß, kannst du die Methodenzeiger nicht ohne Instanz bekommen, daher ist das Static-Deklarieren gängig.</p>
<p>Gruß Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755042</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:18:03 GMT]]></title><description><![CDATA[<p>Ok. Angenommen Threading::HThread ist ein richtig billiger Wrapper für eine Betriebssystemfunktion, die Threads starten kann. Weiter angenommen, der Konstruktor erwartet Parameter a la</p>
<p>1. Funktionszeiger void(__stdcall*)(void*)<br />
2. Zeiger für den Kontext (void*), der an die Funktion übergeben werden soll<br />
3. weitere Optionen, flags, ...</p>
<p>Rate mal, wofür dieser &quot;Kontext-Zeiger&quot; da ist.</p>
<p>Probier mal so etwas wie das hier:</p>
<pre><code class="language-cpp">extern &quot;C&quot; {
  void __stdcall transmogrify(void* context) {
    static_cast&lt;MeineKlasse*&gt;(context)-&gt;elementfunktion();
  }
}
...
MeineKlasse* p = ...;
Threading::HTread t (&amp;transmogrify, p, ...);
</code></pre>
<p>Es ist aber schon schade, dass der Konstruktor nicht so schlau ist und ein &quot;normales&quot; Funktionsobjekt akzeptieren kann -- so, wie es boost::thread kann und demnächst auch std::thread können wird.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755045</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:18:03 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:23:50 GMT]]></title><description><![CDATA[<p>kimmi schrieb:</p>
<blockquote>
<p>Mach die Thread-Startup-Methoden statisch. Soweit ich weiß, kannst du die Methodenzeiger nicht ohne Instanz bekommen, daher ist das Static-Deklarieren gängig.</p>
</blockquote>
<p>Währendem das Objekt vorhanden, also die Instanz gebildet, ist, muss ich doch irgendwie an dessen Adresse kommen, oder?</p>
<p>Ich habe es schon mit folgender Variante probiert:</p>
<pre><code class="language-cpp">void HClasses::ServerSocket::_processMessages(void* _instance)
{
	this-&gt;_receivingThread = new Threading::HThread( (HClasses::ServerSocket*)(_instance)-&gt;_receiveData),
													 NULL,
													 Threading::PREPARED,
													 true                 );
}
</code></pre>
<p>Will aber auch nicht compilieren.</p>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Es ist aber schon schade, dass der Konstruktor nicht so schlau ist und ein &quot;normales&quot; Funktionsobjekt akzeptieren kann -- so, wie es boost::thread kann und demnächst auch std::thread können wird.</p>
</blockquote>
<p>Welche Art von Parameter sollte er dann erwarten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755046</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:41:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Threading::THREAD_ROUTINE p = static_cast&lt;HClasses::ServerSocket*&gt;(_instance)-&gt;_accept;
</code></pre>
<p>Das bringt folgenden Fehler:</p>
<pre><code>Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;HClasses::ServerSocket::_accept&quot;, um einen Zeiger auf den Member zu erstellen.
</code></pre>
<p>Funktioniert also auch nicht.</p>
<p>Baue ich es so auf:</p>
<pre><code class="language-cpp">Threading::THREAD_ROUTINE p = (Threading::THREAD_ROUTINE)(static_cast&lt;HClasses::ServerSocket*&gt;(_instance)-&gt;_accept);
</code></pre>
<p>sagt er:</p>
<pre><code>'Typumwandlung': 'overloaded-function' kann nicht in 'HClasses::Threading::THREAD_ROUTINE' konvertiert werden
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1755058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755058</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:42:09 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich habe es schon mit folgender Variante probiert:</p>
<pre><code class="language-cpp">void HClasses::ServerSocket::_processMessages(void* _instance)
{
	this-&gt;_receivingThread = new Threading::HThread( (HClasses::ServerSocket*)(_instance)-&gt;_receiveData),
													 NULL,
													 Threading::PREPARED,
													 true                 );
}
</code></pre>
</blockquote>
<p>Was ist das denn für ein Unsinn?<br />
Wie ist denn die Signatur Deines HThread-Konstruktors?<br />
Was willst Du eigentlich hier machen?<br />
Warum schreibst Du hier immernoch &quot;NULL&quot;?</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Es ist aber schon schade, dass der Konstruktor nicht so schlau ist und ein &quot;normales&quot; Funktionsobjekt akzeptieren kann -- so, wie es boost::thread kann und demnächst auch std::thread können wird.</p>
</blockquote>
<p>Welche Art von Parameter sollte er dann erwarten?</p>
</blockquote>
<p>Siehe boost::thread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755061</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:49:09 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Was ist das denn für ein Unsinn?<br />
Wie ist denn die Signatur Deines HThread-Konstruktors?<br />
Was willst Du eigentlich hier machen?<br />
Warum schreibst Du hier immernoch &quot;NULL&quot;?</p>
</blockquote>
<p>1. Ich danke dir für deine Hilfe, aber geht`s vielleicht auch freundlicher? Ich würde nicht fragen, wenn ich die Antwort kennen würde. Ich glaube dass vergessen hier einige.</p>
<p>2. Ich schreibe &quot;NULL&quot;, weil im 2. Parameter die &quot;Parameter für die Thread-Funktion&quot; übergeben werden. Da diese jedoch keine hat, ist NULL ziemlich logisch für mich.</p>
<p>Es geht mir im Prinzip doch nur darum, wie ich einen Zeiger auf die Methode bekommen kann. Den Aufruf der Thread-Klasse bekomme ich schon hin.</p>
<p>3. Ich habe keine Ahnung welche Parameter boost::thread erwartet. Ja, ich habe danach gegoogelt, aber nur Tutorials gefunden, in denen boost::thread benutzt wird. Ich sehe daran auch, dass man &quot;normale&quot; Funktionen übergeben kann, stellt sich nur die Frage wie das gemacht wird. Wenn du es mir sagen kannst, bin ich dir dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755065</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:49:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 12:55:17 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>1. Ich danke dir für deine Hilfe, aber geht`s vielleicht auch freundlicher? Ich würde nicht fragen, wenn ich die Antwort kennen würde. Ich glaube dass vergessen hier einige.</p>
</blockquote>
<p>Ja, ich bin patzig geworden. Du hast scheinbar meinen Beitrag ignoriert.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>2. Ich schreibe &quot;NULL&quot;, weil im 2. Parameter die &quot;Parameter für die Thread-Funktion&quot; übergeben werden. Da diese jedoch keine hat, ist NULL ziemlich logisch für mich.</p>
</blockquote>
<p>Und das wäre die Gelegenheit gewesen, der Funktion einen Zeiger auf das Objekt zu übergeben, auf dem Du eine Methode aufrufen willst (siehe meine erste Antwort).</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Es geht mir im Prinzip doch nur darum, wie ich einen Zeiger auf die Methode bekommen kann. Den Aufruf der Thread-Klasse bekomme ich schon hin.</p>
</blockquote>
<p>Einen solchen Zeiger kannst Du aber nicht gebrauchen. Du gibst dem HThread-Konstruktor <em>zwei</em> Zeiger. Einen void (__stdcall*)(void*) und einen *void, der dann an die Funktion gegeben wird. Du erzeugst Dir einfach eine freie Wrapper-Funktion mit der Signatur und __stdcall-Aufruf-Konvention, castest den void* in ein MeineKlasse* um, und rufst die Elementfunktion auf. Als void*-Parameter übergibst Du dann einen Zeiger auf das Objekt.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>3. Ich habe keine Ahnung welche Parameter boost:thread erwartet.</p>
</blockquote>
<p>Schon klar. Nachgucken musst Du aber selbst mal.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755072</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:04:32 GMT]]></title><description><![CDATA[<p>Tut mir wirklich leid, aber ich verstehe zwar was du meinst, weiß aber nicht wie genau ich das umsetzen soll.</p>
<p>Was genau soll ich, deiner Meinung nach, denn als void (__stdcall)(void*) - also ersten Parameter - übergeben?</p>
<pre><code class="language-cpp">&amp;((HClasses::ServerSocket*)_instance)-&gt;_accept
</code></pre>
<p>Wenn ich es caste bekomme ich immer noch die Fehlermeldung:</p>
<pre><code>Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion
</code></pre>
<p>_instance ist ein void*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755075</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:04:32 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:03:49 GMT]]></title><description><![CDATA[<p>Was genau verstehst Du denn nicht an dem 3. Beitrag dieses Threads?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755076</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:05:18 GMT]]></title><description><![CDATA[<p>Naja, hab ich doch geschrieben. Ich weiß nicht wie ich die Thread-Funktion übergeben soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755077</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:10:01 GMT]]></title><description><![CDATA[<p>Ich habe doch ein Beispiel dabei gehabt, was die Übergabe zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755079</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:12:31 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Ich habe doch ein Beispiel dabei gehabt, was die Übergabe zeigt.</p>
</blockquote>
<p>Wenn du das hier meinst:</p>
<pre><code class="language-cpp">extern &quot;C&quot; {
  void __stdcall transmogrify(void* context) {
    static_cast&lt;MeineKlasse*&gt;(context)-&gt;elementfunktion();
  }
}
...
MeineKlasse* p = ...;
Threading::HTread t (&amp;transmogrify, p, ...);
</code></pre>
<p>Das Problem ist aber, dass ich nicht weiß wo ich transmogrify deklarieren soll? Innerhalb der Klasse? Da bekomme ich einen Compilerfehler. Tut mir leid, wenn ich mich gerade etwas doof anstelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755082</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:12:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:22:16 GMT]]></title><description><![CDATA[<p>Wenn ich mir anschaue, wie es in boost::thread gemacht wird:</p>
<pre><code class="language-cpp">struct ThreadProxyData
        {
            typedef unsigned (__stdcall* func)(void*);
            func start_address_;
            void* arglist_;
            ThreadProxyData(func start_address,void* arglist) : start_address_(start_address), arglist_(arglist) {}
        };

        DWORD WINAPI ThreadProxy(LPVOID args)
        {
            ThreadProxyData* data=reinterpret_cast&lt;ThreadProxyData*&gt;(args);
            DWORD ret=data-&gt;start_address_(data-&gt;arglist_);
            delete data;
            return ret;
        }

        typedef void* uintptr_t;

        inline uintptr_t const _beginthreadex(void* security, unsigned stack_size, unsigned (__stdcall* start_address)(void*),
                                              void* arglist, unsigned initflag, unsigned* thrdaddr)
        {
            DWORD threadID;
            HANDLE hthread=CreateThread(static_cast&lt;LPSECURITY_ATTRIBUTES&gt;(security),stack_size,ThreadProxy,
                                        new ThreadProxyData(start_address,arglist),initflag,&amp;threadID);
            if (hthread!=0)
                *thrdaddr=threadID;
            return reinterpret_cast&lt;uintptr_t const&gt;(hthread);
        }
</code></pre>
<p>Stelle ich fest, dass hier doch nicht viel anders verfahren wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755089</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 13:38:33 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Wenn du das hier meinst:</p>
<pre><code class="language-cpp">extern &quot;C&quot; {
  void __stdcall transmogrify(void* context) {
    static_cast&lt;MeineKlasse*&gt;(context)-&gt;elementfunktion();
  }
}
...
MeineKlasse* p = ...;
Threading::HTread t (&amp;transmogrify, p, ...);
</code></pre>
<p>Das Problem ist aber, dass ich nicht weiß wo ich transmogrify deklarieren soll? Innerhalb der Klasse?</p>
</blockquote>
<p>Nein, das soll eine freie Funktion sein. Ich bin mir nur nicht sicher, ob die &quot;__stdcall&quot;-Syntax da richtig ist. Das ist eh kein Standard-C++...</p>
<p>Idealerweise versteckt man so etwas hinter der Thread-Bibliothek, wie es boost::thread tut. boost::thread akzeptiert beliebige &quot;Funktoren&quot; und setzt das intern wahrscheinlich mit &quot;Type Erasure&quot; um. Du hast aber nicht vor, eine eigene Thread-Bibliothek zu schreiben, oder? Das würde ich Spezialisten überlassen...</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755103</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Wed, 05 Aug 2009 10:46:10 GMT]]></title><description><![CDATA[<p>nein natürlich nicht.</p>
<p>Ich halte die Vorgehensweise dennoch für schlauer, dass man auch normale Funktionen übergeben kann, die dann intern aufgerufen werden. Das macht alles ein wenig einfacher.</p>
<p>Ich bekomme jedoch bei der Zuweisung von &quot;ret&quot; eine Exception</p>
<pre><code class="language-cpp">unsigned long __stdcall ThreadProxy( void* args )
{
	ThreadProxyData* data = reinterpret_cast&lt;ThreadProxyData*&gt;(args);
	DWORD ret = data-&gt;start_address_(data-&gt;arglist_);
    delete data;
    return ret;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1755107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755107</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 14:00:38 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Funktionen &quot;castet&quot; man nicht.</p>
<p>Ich übergebe an den nächsten Hilfsbereiten. Meine Zeit für heute ist um.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755119</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 14:01:50 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Funktionen &quot;castet&quot; man nicht.</p>
</blockquote>
<p>Ich meinte auch nicht die Funktion die gecastet wird. Hier wird doch einfach eine struct gecastet, die dann die Adresse der Funktion und deren Parameter enthält oder etwa nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755120</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 14:20:43 GMT]]></title><description><![CDATA[<p>Hier ist ein letztes und vollständiges Beispiel, welches das Prinzip verdeutlichen soll, mit dem man Elementfunktionen aufrufen kann, obwohl man einen Zeiger auf eine freie Funktion übergeben muss. Der Schlüssel zur Lösung ist hier der void*-Parameter.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

typedef void thread_funktion_t(void*);

void ruf_auf(thread_funktion_t* pf, void* kontext)
{
  pf(kontext);
}

class MeineKlasse
{
public:
  void foo();
};  

void MeineKlasse::foo()
{
  std::cout &lt;&lt; &quot;Hallo!\n&quot;;
}

void proxy_MeineKlasse_foo(void* kontext)
{
  static_cast&lt;MeineKlasse*&gt;(kontext)-&gt;foo();
}

int main()
{
  MeineKlasse o;
  ruf_auf(proxy_MeineKlasse_foo,&amp;o);
}
</code></pre>
<p>Wenn Du damit jetzt nichts anfangen kannst, solltest Du die Finger von Threads lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755136</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 14:32:20 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Wenn Du damit jetzt nichts anfangen kannst, solltest Du die Finger von Threads lassen.</p>
</blockquote>
<p>Doch doch, dass ist mir doch auch klar. Die Frage geht eigentlich in eine andere Richtung mittlerweile.</p>
<p>Wie kann ich es anstellen, dass ich meiner Thread Klasse eine Funktion mit beliebiger Konvention übergebe, so wie es ja anscheinend boost::thread macht?<br />
Ich meine, dass bekomme ich natürlich schon hin:</p>
<pre><code class="language-cpp">typedef unsigned (__stdcall *func)(void*);
	func f = static_cast&lt;func&gt;(this-&gt;_lpFunction);
	this-&gt;_hThread = mybeginthreadex( NULL,
									  0,
									  f,
									  this-&gt;_lpParams,
									  CREATE_SUSPENDED,
									  0 );
</code></pre>
<p>aber wenn _lpFunction ein void* ist, wird logischerweise der Stack nicht korrekt bereinigt. Mich würde interessieren, wie man diese Problematik lösen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755146</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 14:53:14 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Die Frage geht eigentlich in eine andere Richtung mittlerweile.</p>
<p>Wie kann ich es anstellen, dass ich meiner Thread Klasse eine Funktion mit beliebiger Konvention übergebe, so wie es ja anscheinend boost::thread macht?</p>
</blockquote>
<p>Mit einer Kombination aus Templates und Laufzeitpolymorphie. Die Technik heißt dann &quot;Type Erasure&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755158</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 15:00:23 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Mit einer Kombination aus Templates und Laufzeitpolymorphie. Die Technik heißt dann &quot;Type Erasure&quot;.</p>
</blockquote>
<p>Da lohnt sich der Aufwand nicht wirklich, würde ich sagen.</p>
<p>Ein Problem hat deine Lösung jedoch noch:<br />
1. Die Thread-Funktion selbst startet die eigentlich Funktion die durch den Thread ausgeführt werden soll und muss außerhalb der Klasse deklariert sein.<br />
2. Damit muss die eigentliche Thread-Funktion (innerhalb der Klasse) unbedingt public sein, damit ich sie aufrufen kann ...</p>
<p>nicht unbedingt die eleganteste Lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755167</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 15:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 15:26:14 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ein Problem hat deine Lösung jedoch noch:<br />
1. Die Thread-Funktion selbst startet die eigentlich Funktion die durch den Thread ausgeführt werden soll und muss außerhalb der Klasse deklariert sein.<br />
2. Damit muss die eigentliche Thread-Funktion (innerhalb der Klasse) unbedingt public sein, damit ich sie aufrufen kann ...</p>
</blockquote>
<p>Es war keine &quot;Lösung&quot; sondern ein Beispiel, welches Dir etwas verdeutlichen sollte.</p>
<blockquote>
<p>nicht unbedingt die eleganteste Lösung</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755180</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 15:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 18:05:22 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ein Problem hat deine Lösung jedoch noch:<br />
1. Die Thread-Funktion selbst startet die eigentlich Funktion die durch den Thread ausgeführt werden soll und muss außerhalb der Klasse deklariert sein.<br />
2. Damit muss die eigentliche Thread-Funktion (innerhalb der Klasse) unbedingt public sein, damit ich sie aufrufen kann ...</p>
</blockquote>
<p>Es war keine &quot;Lösung&quot; sondern ein Beispiel, welches Dir etwas verdeutlichen sollte.</p>
<blockquote>
<p>nicht unbedingt die eleganteste Lösung</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Ja, okay - aber soll das etwa heißen, dass es keine Lösung für das Problem gibt? Es wird doch wohl möglich sein einen Thread aus einer Klasse heraus zu starten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755258</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 04 Aug 2009 18:05:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 18:24:06 GMT]]></title><description><![CDATA[<p>Nichts hindert dich, eine statische Memberfunktion zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755274</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 04 Aug 2009 18:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer innerhalb Klasse auf Memberfunktion on Tue, 04 Aug 2009 18:41:21 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ja, okay - aber soll das etwa heißen, dass es keine Lösung für das Problem gibt?</p>
</blockquote>
<p>Welches Problem? Gibt es noch eins?</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Es wird doch wohl möglich sein einen Thread aus einer Klasse heraus zu starten</p>
</blockquote>
<p>Falls Du damit meinst, einen Thread eine Elementfunktion ausführen zu lassen: Klar, das geht! Siehe boost::thread, boost::bind und als &quot;type erasure&quot;-Beispiel noch boost::function. Ich werde Dir das hier nicht vorkauen. Du hast genug Stichwörter bekommen. Recherchiere selbst. Es lohnt sich!</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755289</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 18:41:21 GMT</pubDate></item></channel></rss>