<?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[Problem beim umgehen eines pointer-to-member-function&#x27;s]]></title><description><![CDATA[<p>Hallo erst einmal,</p>
<p>ich bin noch etwas grün hinter den Ohren was das Programieren angeht, aber ich muss da halt durch.<br />
Also ich versuche ein &quot;ROOT-Programm&quot; in ein C++ Programm zu überführen. Dabei ist das aktuelle Problem folgendes:<br />
SetFCN mag keinen pointer-to-member-function sonder nur pointer-to-function. Deshalb versuche ich nun die member-function in eine globale Funktion einzupacken.</p>
<pre><code class="language-cpp">// main.cpp

int main(int argc, char** argv) {

    B_Class* B_p = new B_Class();   
    B_Class* ptr;
    B_p-&gt;setup(ptr);

    A_Class* A_p = new A_Class();
    A_p-&gt;fa(ptr);

    return (EXIT_SUCCESS);
}
</code></pre>
<pre><code class="language-cpp">//A_Class.cpp

extern &quot;C&quot;  void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag);

void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag)
{
    ptr-&gt;fb(npar, gin, f, par, iflag);               //  ***** Fehler *****
}    

void A_Class::fa(B_Class* ptr)
{
      TMinuit *gMinuit = new TMinuit(7);
      gMinuit-&gt;SetFCN(wrap);    
}
</code></pre>
<pre><code class="language-cpp">// B_Class.cpp

void B_Class::fb(Int_t &amp;, Double_t *, Double_t &amp;, Double_t *, Int_t )
{
    x=p;  // hier eigentlich wilde Funktionen
}

void B_Class::setup(B_Class* ptr)
{
    ptr = this;
}
</code></pre>
<p>Fehlermeldung:</p>
<pre><code class="language-cpp">A_Class.cpp:21: error: ‘ptr’ was not declared in this scope
</code></pre>
<p>Mir ist eigentlich klar, DASS 'ptr' dort nicht &quot;sichtbar&quot; ist, aber ich weiß nicht wie ich das ändern kann.<br />
warp() und fb() müssen unbedingt diese Parameter haben und keine anderen.<br />
In meiner Anfängernaivität hab unter anderem überlegt so etwas zu machen wie:</p>
<p>wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag ,<em><em>B_Class</em> ptr</em><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>das geht aber nicht weil SetFCN nur folgendes erwartet:</p>
<pre><code class="language-cpp">//  virtual void	SetFCN(void* fcn)
//  virtual void	SetFCN(void (*)(Int_t&amp;, Double_t*, Double_t&amp;f, Double_t*, Int_t) fcn)
</code></pre>
<p>So nun hoffe ich erst einmal, dass es eine Lösung gibt, zweites dass ihr sie wisst und mir schreibt und drittens dass ich das dann auch umsetzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289553/problem-beim-umgehen-eines-pointer-to-member-function-s</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 02:53:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289553.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Jul 2011 14:55:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem beim umgehen eines pointer-to-member-function&#x27;s on Thu, 07 Jul 2011 14:55:26 GMT]]></title><description><![CDATA[<p>Hallo erst einmal,</p>
<p>ich bin noch etwas grün hinter den Ohren was das Programieren angeht, aber ich muss da halt durch.<br />
Also ich versuche ein &quot;ROOT-Programm&quot; in ein C++ Programm zu überführen. Dabei ist das aktuelle Problem folgendes:<br />
SetFCN mag keinen pointer-to-member-function sonder nur pointer-to-function. Deshalb versuche ich nun die member-function in eine globale Funktion einzupacken.</p>
<pre><code class="language-cpp">// main.cpp

int main(int argc, char** argv) {

    B_Class* B_p = new B_Class();   
    B_Class* ptr;
    B_p-&gt;setup(ptr);

    A_Class* A_p = new A_Class();
    A_p-&gt;fa(ptr);

    return (EXIT_SUCCESS);
}
</code></pre>
<pre><code class="language-cpp">//A_Class.cpp

extern &quot;C&quot;  void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag);

void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag)
{
    ptr-&gt;fb(npar, gin, f, par, iflag);               //  ***** Fehler *****
}    

void A_Class::fa(B_Class* ptr)
{
      TMinuit *gMinuit = new TMinuit(7);
      gMinuit-&gt;SetFCN(wrap);    
}
</code></pre>
<pre><code class="language-cpp">// B_Class.cpp

void B_Class::fb(Int_t &amp;, Double_t *, Double_t &amp;, Double_t *, Int_t )
{
    x=p;  // hier eigentlich wilde Funktionen
}

void B_Class::setup(B_Class* ptr)
{
    ptr = this;
}
</code></pre>
<p>Fehlermeldung:</p>
<pre><code class="language-cpp">A_Class.cpp:21: error: ‘ptr’ was not declared in this scope
</code></pre>
<p>Mir ist eigentlich klar, DASS 'ptr' dort nicht &quot;sichtbar&quot; ist, aber ich weiß nicht wie ich das ändern kann.<br />
warp() und fb() müssen unbedingt diese Parameter haben und keine anderen.<br />
In meiner Anfängernaivität hab unter anderem überlegt so etwas zu machen wie:</p>
<p>wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag ,<em><em>B_Class</em> ptr</em><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>das geht aber nicht weil SetFCN nur folgendes erwartet:</p>
<pre><code class="language-cpp">//  virtual void	SetFCN(void* fcn)
//  virtual void	SetFCN(void (*)(Int_t&amp;, Double_t*, Double_t&amp;f, Double_t*, Int_t) fcn)
</code></pre>
<p>So nun hoffe ich erst einmal, dass es eine Lösung gibt, zweites dass ihr sie wisst und mir schreibt und drittens dass ich das dann auch umsetzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2089983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2089983</guid><dc:creator><![CDATA[rangernumber1]]></dc:creator><pubDate>Thu, 07 Jul 2011 14:55:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim umgehen eines pointer-to-member-function&#x27;s on Thu, 07 Jul 2011 17:41:54 GMT]]></title><description><![CDATA[<p>Okay, also so wie ich das verstehe möchtest Du einer Funktion, die einen Funktionszeiger erwartet, einen Methodenzeiger übergeben. Das funktioniert so leider nicht. Du kannst auch keinen Zeiger auf die Klasse &quot;reinschmuggeln&quot;. Das Einzige, was mir einfällt, sind globale Variablen, die Du vor dem Aufruf änderst.</p>
<pre><code class="language-cpp">B_Class* currentBClass;

void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag)
{
    currentBClass-&gt;fb(npar, gin, f, par, iflag);               //  ***** Fehler *****
} 

int main(/*...*/)
{
BClass bClass1, bClass2;

currentBClass = &amp;bClass1;
wrap(/*...*/);
currentBClass = &amp;bClass2;
wrap(/*...*/);
}
</code></pre>
<p>Hilft Dir das etwas weiter? Evtl. kannst Du uns auch ein paar Rahmeninformationen geben, damit wir Dir zu einem besseren Design oder so raten können. &quot;ROOT-Programm&quot; sagt mir erstmal nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090035</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 07 Jul 2011 17:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim umgehen eines pointer-to-member-function&#x27;s on Fri, 08 Jul 2011 13:37:55 GMT]]></title><description><![CDATA[<p>Hallo Eisflamme,<br />
danke für deine Hilfe!<br />
mit ROOT-Programm meine ich:<br />
<a href="http://en.wikipedia.org/wiki/ROOT" rel="nofollow">http://en.wikipedia.org/wiki/ROOT</a></p>
<p>Schade das es da keinen anderen Trick gibt, &quot;reinschmuggeln&quot; hätte mir gefallen. *g*</p>
<p>Ich hab das mit der globalen Variable hinbekommen und es läuft so wie ich es mir vorstelle.<br />
Danke noch mal!</p>
<p>Hier &quot;meine Lösung&quot; für andere Suchende.</p>
<pre><code class="language-cpp">&quot;main.cpp&quot;

#include &lt;stdlib.h&gt;
#include &quot;A_Class.h&quot;
#include &quot;B_Class.h&quot;

B_Class* ptr_global;

int main(int argc, char** argv) {

    B_Class* B_p = new B_Class();   
    B_Class* ptr;
    B_p-&gt;setup(ptr);
    ptr_global=ptr;
    A_Class* A_p = new A_Class();
    A_p-&gt;fa();

    return (EXIT_SUCCESS);
}
</code></pre>
<pre><code class="language-cpp">&quot;A_Class.h&quot;
#ifndef _A_CLASS_H
#define	_A_CLASS_H
#include &quot;B_Class.h&quot;

class A_Class {
public:
    A_Class();
    A_Class(const A_Class&amp; orig);
    virtual ~A_Class();
    void fa();
private: 
};
#endif	/* _A_CLASS_H */
</code></pre>
<pre><code class="language-cpp">&quot;A_Class.cpp&quot;
#include &quot;A_Class.h&quot;
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;
#include &quot;B_Class.h&quot;
#include &quot;TROOT.h&quot;
#include &quot;TMinuit.h&quot;

double x=2;
double p=3;

extern B_Class* ptr_global;

extern &quot;C&quot;  void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag);

void wrap(Int_t &amp;npar, Double_t *gin, Double_t &amp;f, Double_t *par, Int_t iflag)
{
    ptr_global-&gt;fb(npar, gin, f, par, iflag);
}    

A_Class::A_Class(){

}

A_Class::A_Class(const A_Class&amp; orig) {
}

A_Class::~A_Class() {
}

void A_Class::fa()
{
      TMinuit *gMinuit = new TMinuit(7);
      gMinuit-&gt;SetFCN(wrap);
      std::cout &lt;&lt; &quot;fa() done&quot; &lt;&lt; std::endl;   
}
</code></pre>
<pre><code class="language-cpp">&quot;B_Class.h&quot;
#ifndef _B_CLASS_H
#define	_B_CLASS_H
#include &quot;TROOT.h&quot;

class B_Class {
public:
    B_Class();
    B_Class(const B_Class&amp; orig);
    virtual ~B_Class();
    void fb(Int_t &amp;, Double_t *, Double_t &amp;, Double_t *ar, Int_t );
    void setup(B_Class*);
private:
};
#endif	/* _B_CLASS_H */
</code></pre>
<pre><code class="language-cpp">&quot;B_Class.cpp&quot;
extern double x;
extern double p;

B_Class::B_Class() {
}

B_Class::B_Class(const B_Class&amp; orig) {
}

B_Class::~B_Class() {
}

void B_Class::fb(Int_t &amp;, Double_t *, Double_t &amp;, Double_t *, Int_t )
{
    x=p;       // irgend eine Funktion halt
}

void B_Class::setup(B_Class* ptr)
{
    ptr = this;
}
</code></pre>
<p>Hier noch ein mal Schlagwörter:<br />
virtual void SetFCN(void* fcn)<br />
virtual void SetFCN(void (<em>)(Int_t&amp;, Double_t</em>, Double_t&amp;f, Double_t*, Int_t) fcn)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090318</guid><dc:creator><![CDATA[rangernumber1]]></dc:creator><pubDate>Fri, 08 Jul 2011 13:37:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim umgehen eines pointer-to-member-function&#x27;s on Fri, 08 Jul 2011 16:14:54 GMT]]></title><description><![CDATA[<p>rangernumber1 schrieb:</p>
<blockquote>
<p>Schade das es da keinen anderen Trick gibt, &quot;reinschmuggeln&quot; hätte mir gefallen. *g*</p>
</blockquote>
<p>Gibt es, ist aber nicht portierbar, und auch nicht ganz einfach.<br />
Nennt sich &quot;thunk&quot;.<br />
Kannst mal danach googeln.</p>
<p>Das Prinzip dahinter ist dynamisch Code für eine Funktion zu generieren, die an eine andere Funktion weiterleitet, und dabei einen zusätzlichen Parameter übergibt.<br />
Der Wert für den zusätzlichen Parameter wird dabei zur Laufzeit an die Thunk-Erzeuger-Funktion übergeben. Und der Wert wird dabei nicht in einer globalen Variable gespeichert, sondern ist Teil des &quot;Thunks&quot;. Dadurch kann man mehrere solche &quot;Thunks&quot; mit unterschiedlichen Werten gleichzeitig haben &amp; verwenden. Und wenn man den &quot;Thunk&quot; nimmer braucht, löscht man ihn einfach.</p>
<p>In deinem Fall wäre der zusätzliche Parameter dein &quot;ptr&quot;.</p>
<p>Und den so generierten &quot;Thunk&quot; setzt man dann als Callback-Funktion.</p>
<p>Leider kenne ich keine Library/Framework mit der/dem man so einen Thunk halbwegs einfach erzeugen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090383</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 08 Jul 2011 16:14:54 GMT</pubDate></item></channel></rss>