<?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[Referenzierung von Funktionen über Pointer]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie lautet die syntaktisch richtige Formulierung, wenn ich folgende Klasse habe</p>
<pre><code class="language-cpp">class Cfoo
{  public:
      Cfoo( void (*pifn)( int i)){ pfn = ipfn;};
      void (*pfn)( int i);
}
</code></pre>
<p>und folgende Funktionsdeklaration:</p>
<pre><code class="language-cpp">void func( Cfoo&amp; param);
</code></pre>
<p>wie muss der Funktionsaufruf über den Pointer pfn in func lauten?</p>
<pre><code class="language-cpp">(param.*pfn)( 12345);
</code></pre>
<p>bringt eine Fehlermeldung, dass der Identifier pfn nicht deklariert sei!</p>
<p>Wie macht man's richtig?</p>
<p>Gruß</p>
<p>MQ</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206660/referenzierung-von-funktionen-über-pointer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 14:57:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206660.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Feb 2008 12:03:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 12:03:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie lautet die syntaktisch richtige Formulierung, wenn ich folgende Klasse habe</p>
<pre><code class="language-cpp">class Cfoo
{  public:
      Cfoo( void (*pifn)( int i)){ pfn = ipfn;};
      void (*pfn)( int i);
}
</code></pre>
<p>und folgende Funktionsdeklaration:</p>
<pre><code class="language-cpp">void func( Cfoo&amp; param);
</code></pre>
<p>wie muss der Funktionsaufruf über den Pointer pfn in func lauten?</p>
<pre><code class="language-cpp">(param.*pfn)( 12345);
</code></pre>
<p>bringt eine Fehlermeldung, dass der Identifier pfn nicht deklariert sei!</p>
<p>Wie macht man's richtig?</p>
<p>Gruß</p>
<p>MQ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463911</guid><dc:creator><![CDATA[MasterQ]]></dc:creator><pubDate>Wed, 27 Feb 2008 12:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 12:16:01 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

class foo_t {

	public:
		typedef void ( *function_t )( int );

		function_t m_function;

		foo_t( function_t function )
			: m_function( function ) { };
};

void bar( int param ) {

	std::cout &lt;&lt; param &lt;&lt; std::endl;
}

int main( ) {

	foo_t foo( bar );
	foo.m_function( 42 );
}
</code></pre>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463932</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 27 Feb 2008 12:16:01 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 12:18:49 GMT]]></title><description><![CDATA[<p>param.pfn ist der Funktionspointer, den musst du dereferenzieren:</p>
<pre><code class="language-cpp">(*(param.pfn))(12345);
</code></pre>
<p>Die Klammern um param.pfn kannst du dabei weglassen, weil der .-operator hoehere prioritaet hat als der Dereferenzierungsoperator (ich persoenlich finds klarer)</p>
<p>Angaben ohne Gewaehr, bin mir nicht 100%ig sicher...</p>
<p>Den operator .* benutzt man, wenn pfn ein Zeiger auf einen Member von Cfoo ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463939</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 27 Feb 2008 12:18:49 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 12:21:12 GMT]]></title><description><![CDATA[<p>Ups, falsch gelesen.</p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463942</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 27 Feb 2008 12:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 13:21:32 GMT]]></title><description><![CDATA[<p>Hmm ... warum heißen Funktionszeiger eigtl. Funktions<strong>zeiger</strong>? Nagut ... könnte man ja mal '&amp;' setzen ... nur weil es eine &quot;Unsauberkeit&quot; ist, die zulässlich ist, ist es trotzdem nicht schön <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>
<p>Und genau wie diese &quot;Unsauberkeit&quot; zulässig ist, ist auch der Aufruf, so wie in Swordfish gezeigt hat, zulässig.</p>
<p><a href="http://www.newty.de/fpt/fpt.html#callconv" rel="nofollow">http://www.newty.de/fpt/fpt.html#callconv</a> (<a href="http://www.function-pointer.org" rel="nofollow">www.function-pointer.org</a>)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class foo 
{
public:
    typedef void (*fnPtr_t )(const int);

    foo(fnPtr_t function)
        : m_function( function ) 
    {};

public:
    void operator()(const int value) const { (*m_function)(value); }

private:
    fnPtr_t m_function;
};

void bar(const int param) 
{ std::cout &lt;&lt; param &lt;&lt; std::endl; }

int main() 
{
    foo instance(&amp;bar);
    instance(42);
}
</code></pre>
<p><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/1464000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464000</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 27 Feb 2008 13:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 13:31:21 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>param.pfn ist der Funktionspointer, den musst du dereferenzieren:</p>
<pre><code class="language-cpp">(*(param.pfn))(12345);
</code></pre>
</blockquote>
<p>Das hatte ich als allererstes versucht. Doch auch da gibt es eine, wenn auch andere, Fehlermeldung.</p>
<p>error C2064: term does not evaluate to a function taking 2 arguments</p>
<p>In der Hilfe zu C2064 kömmt:</p>
<p>A call is made to a function through an expression. The expression does not evaluate to a function pointer.</p>
<p>hier mal mein originalcode:</p>
<pre><code class="language-cpp">class xjhView;

class CxjhStream
{
public:
	CxjhStream( void);
	CxjhStream( void (CxjhView::*pfn)( const char *s, int i), int color);
	~CxjhStream( void);

      CxjhStream&amp; operator&lt;&lt; (CxjhStream&amp; ( *pf )(CxjhStream&amp; out));

	void (CxjhView::* pfn)( const char *s, int i);
	void putstr( const char *s);
};

CxjhStream&amp; operator&lt;&lt; (CxjhStream &amp;out, const char *s)
{  ((out.*pfn))( s, out.color);  // pfn undeclared
   (*(out.pfn))( s, color); // C2171: '*' : illegal on operands of type 'void (__thiscall CxjhView::* )(const char *,int)
   out.putstr( s); // als workaround, führt zu oben genanntem C2064
   return out;
}

void CxjhStream::putstr( const char *s)
{  (this-&gt;pfn)( s, color); // C2064
   pfn( s, color); // C2064
   (*pfn)( s, color); // C2171 '*' illegal on operands of type 'void __thiscall CxjhView::* )(const char *,int)'

}
</code></pre>
<p>MQ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464009</guid><dc:creator><![CDATA[MasterQ]]></dc:creator><pubDate>Wed, 27 Feb 2008 13:31:21 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 14:13:21 GMT]]></title><description><![CDATA[<p>Um deinen Methodenpointer dereferenzieren zu können brauchst Du ein passendes (in deinem Fall <code>xjhView</code> ) Objekt dazu. BTW: Der <code>void</code> Parameter von des c-tors ist unnötig und der des d-tors sogar ungültig.</p>
<p>greetz, Swordfish</p>
<p>PS: <code>typedef</code> ist was Tolles...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464044</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 27 Feb 2008 14:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 14:13:53 GMT]]></title><description><![CDATA[<p>Das kann so nicht gehen <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>
<pre><code class="language-cpp">CxjhStream&amp; operator&lt;&lt; (CxjhStream &amp;out, const char *s)
</code></pre>
<p>hier hast du vergessen anzugeben, dass der Operator ein Element der Klasse CxjhStream ist. Bzw. noch einen anderen Fehler gemacht.</p>
<pre><code class="language-cpp">class my_stream
{
    typedef void (my_stream::*fnPtr)(const char*, int);
    fnPtr m_function;
    int m_color;

public:
    my_stream(fnPtr function(NULL), const int color(0))
        : m_function(function), m_color(color)
    {}

    friend my_stream&amp; operator&lt;&lt; (my_stream&amp; out, const char* string)
    { (out.*out.m_function)(string, out.m_color); return out; }
};
</code></pre>
<p>so sollte es gehen. Evtl. aber auch:</p>
<pre><code class="language-cpp">{ (out.*(out.m_function))(string, out.m_color); return out; }
</code></pre>
<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464046</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 27 Feb 2008 14:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 14:33:27 GMT]]></title><description><![CDATA[<p>(D)Evil, ich möcht' Dir nicht den Spaß verderben, aber sein Methodenpointer ist vom Typ <code>CxjhView::*</code> .</p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464063</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 27 Feb 2008 14:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 14:44:28 GMT]]></title><description><![CDATA[<p>Na dann hat er halt NOCH EINEN Fehler drin. Memberfunktionen können nur per entsprechendem Objekt aufgerufen werden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464072</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 27 Feb 2008 14:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 15:31:08 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Na dann hat er halt NOCH EINEN Fehler drin. Memberfunktionen können nur per entsprechendem Objekt aufgerufen werden!</p>
</blockquote>
<p>und genau da kommt der Schlammassel ja her.</p>
<p>Das was ich hier vorgestellt habe, ist der Versuch einen Zirkelschluss zu brechen.</p>
<p>Das eigentliche Problem ist ein Henne-Ei Problem.</p>
<p>Ich habe eine Klasse, die die Bildschirmausgabe eines Fensters regelt, MFC CView. Weiterhin habe ich eine alte Konsolenanwendung, die auf iostream basiert und mit std::cout und std::cerr werkelt. Beides muss ich nun zusammenbringen.</p>
<p>Daher muss ich cout so nachbauen, dass der originale Code so wenig wie möglich verändert werden muss und mein neues cout die Ausgabe ins CView übergibt. Bei dem Versuch, die Routine von CView in meinem Stream aufzurufen, habe ich mich verheddert, weil mein Stream CView kennen muss und umgekehrt. Irgendwie ließ sich das nicht auflösen. Also ging ich soweit zu versuchen, einfach einen Pointer auf die entsprechende Funktion (Member von View) im Stream zu hinterlegen und diese dann aufzurufen.</p>
<p>Aber auch das wird nicht gehen, weil sich das irgendwie alles selbst hinten reinbeißt.</p>
<p>MQ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464114</guid><dc:creator><![CDATA[MasterQ]]></dc:creator><pubDate>Wed, 27 Feb 2008 15:31:08 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 15:33:40 GMT]]></title><description><![CDATA[<p>Mach es dir einfacher: Streambuffer ableiten, der die Ausgabe in CView umleitet. Dann einfach dein std::cout, std::clog und std::cerr auf den Streambuffer umleiten und fertig <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/1464119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464119</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 27 Feb 2008 15:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 15:38:11 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Mach es dir einfacher: Streambuffer ableiten, der die Ausgabe in CView umleitet. Dann einfach dein std::cout, std::clog und std::cerr auf den Streambuffer umleiten und fertig <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>
</blockquote>
<p>Sorry, bin kein Profi!</p>
<p>Was meinst du mit Streambuffer, den rdbuf()?</p>
<p>Wie leite ich std::cerr um??</p>
<p>Die CView-Klasse bzw. genauer die CRichEditCtrl bietet streaming in den internen Buffer an. Das habe ich ausprobiert, scheitert aber leider daran, dass damit immer nur der komplette Buffer angesprochen wird. Rufe ich die Streamin-Routine ein zweites mal auf, wird der Inhalt vom ersten mal gelöscht. Ich kann nix anhängen sondern nur komplett den Inhalt ersetzen.</p>
<p>MQ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464126</guid><dc:creator><![CDATA[MasterQ]]></dc:creator><pubDate>Wed, 27 Feb 2008 15:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Wed, 27 Feb 2008 16:41:24 GMT]]></title><description><![CDATA[<p>Also in C++ haben Streams, die von std::ios abgeleitet sind, einen Buffer(std::basic_streambuf).<br />
Wenn du nun einen eigenen streambuf von std::streambuf ableitest, und setzt dann den Buffer:</p>
<pre><code class="language-cpp">my_streambuf buffer;
std::cout.rdbuf(&amp;buffer);
std::clog.rdbuf(&amp;buffer);
std::cerr.rdbuf(&amp;buffer);
</code></pre>
<p>ein Beispiel, wie du von std::streambuf ableitest, findest du als &quot;Weiche&quot; hier im Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464184</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 27 Feb 2008 16:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzierung von Funktionen über Pointer on Thu, 28 Feb 2008 08:26:06 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Also in C++ haben Streams, die von std::ios abgeleitet sind, einen Buffer(std::basic_streambuf).<br />
Wenn du nun einen eigenen streambuf von std::streambuf ableitest, und setzt dann den Buffer:</p>
<pre><code class="language-cpp">my_streambuf buffer;
std::cout.rdbuf(&amp;buffer);
std::clog.rdbuf(&amp;buffer);
std::cerr.rdbuf(&amp;buffer);
</code></pre>
<p>ein Beispiel, wie du von std::streambuf ableitest, findest du als &quot;Weiche&quot; hier im Forum.</p>
</blockquote>
<p>Funktioniert das?? In meinem Fall jedenfalls nicht so wie gewünscht!</p>
<p>Von einem Konsolenprogramm werden normalerweise mehrere und verschiedene Aufrufe von cout getätigt. Nach einem flush() landet der Inhalt von Streampuffer auf dem Bildschirm. Danach ist der Streampuffer wieder leer, der ehemalige Inhalt aber bleibt auf dem Screen erhalten.</p>
<p>Das einfache &quot;Umbiegen&quot; des Streampuffers auf einen eigenen oder den einer CView-Klasse bringt nicht das gewünschte Ergebnis. Wie schon erwähnt, wird nach einem flush() der Puffer geleert. Nach einem Neuaufbau des Bildschirms wäre dann auch der alte Inhalt weg.</p>
<p>Was ich brauche ist ein Stream, der den Inhalt seines Puffers an den Inhalt der CView hintanhängt. Nun habe ich keinen direkten Zugriff auf den Puffer/Speicher von CView bzw. CRichEditView und kann nur über Memberfunktions Inhalte einfügen.</p>
<p>Bei dem Versuch, meiner Streamklasse Zugriff auf die geschützen bzw. privaten Funktionen von CRichEditView zu ermöglichen habe ich mich verheddert. Ein &quot;Schlupfloch&quot; konnte ich nicht finden.</p>
<p>Den erwähnten Zirkelschluss konnte ich inzwischen brechen. Ich muss nur meinem Stream nicht CView mitgeben sondern die Tochterklasse, die den Inhalt verwaltet, nämlich CRichEditCtrl.</p>
<p>Damit muss CView meinen Stream kennen und mein Stream eben nicht CView sondern CRichEditCtrl. Damit komm ich hin.<br />
Die Abhängigkeiten der MFC sind derart verworren und vielschichtig, dass ich es als &quot;Hobbyprogrammierer&quot; nicht hinbekommen hatte, alle Abhängigkeiten zufrieden zu stellen. Und dann fängt man an zu probieren und zu basteln und verschlimmbessert alles. Na ja, jetzt tutet es.</p>
<p>MQ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464536</guid><dc:creator><![CDATA[MasterQ]]></dc:creator><pubDate>Thu, 28 Feb 2008 08:26:06 GMT</pubDate></item></channel></rss>