<?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[Methodenzeiger wie casten?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hoffe ihr könnt mir helfen.</p>
<p>kann mir jemand sagen ich wie folgendes Kompiliert bekomme?</p>
<pre><code>typedef void (*Mytypdef)();

class A
{
    private:
    public:
        A();
        Mytypdef MeineFunktion;
};

class B
{
    private:
        A Test;

    public:
        B();

        void funktion2()
        {
            // Do anything
        }

        void funktion1()
        {
            Test.MeineFunktion=funktion2;
        }
};
</code></pre>
<p>ist zwar ein sinnloses Beispiel aber beschreibt was ich will.</p>
<p>der Compiler schmeißt jetzt folgenden Fehler:</p>
<pre><code>cannot convert 'B::funktion2' from type 'void (B::)()' to type 'Mytypdef {aka void (*)()}'
</code></pre>
<p>macht ja durchaus Sinn, aber wie geht's richtig? in VCL gibt's das Schlüsselwort __closure aber das kennt der Compiler (gcc) nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325148/methodenzeiger-wie-casten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 00:03:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325148.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Apr 2014 16:42:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenzeiger wie casten? on Wed, 16 Apr 2014 16:42:25 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hoffe ihr könnt mir helfen.</p>
<p>kann mir jemand sagen ich wie folgendes Kompiliert bekomme?</p>
<pre><code>typedef void (*Mytypdef)();

class A
{
    private:
    public:
        A();
        Mytypdef MeineFunktion;
};

class B
{
    private:
        A Test;

    public:
        B();

        void funktion2()
        {
            // Do anything
        }

        void funktion1()
        {
            Test.MeineFunktion=funktion2;
        }
};
</code></pre>
<p>ist zwar ein sinnloses Beispiel aber beschreibt was ich will.</p>
<p>der Compiler schmeißt jetzt folgenden Fehler:</p>
<pre><code>cannot convert 'B::funktion2' from type 'void (B::)()' to type 'Mytypdef {aka void (*)()}'
</code></pre>
<p>macht ja durchaus Sinn, aber wie geht's richtig? in VCL gibt's das Schlüsselwort __closure aber das kennt der Compiler (gcc) nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394902</guid><dc:creator><![CDATA[Frageman123]]></dc:creator><pubDate>Wed, 16 Apr 2014 16:42:25 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger wie casten? on Wed, 16 Apr 2014 17:06:00 GMT]]></title><description><![CDATA[<p>Die Lösung heißt<a href="http://de.cppreference.com/w/cpp/utility/functional/function" rel="nofollow"> <code>std::function</code> </a>:</p>
<pre><code>using Mytypdef = std::function&lt;void()&gt;;

class A
{
        Mytypdef MeineFunktion;
};

class B
{
    private:
        A Test;

    public:

        void funktion2()
        {
            // Do anything
        }

        void funktion1()
        {
            Test.MeineFunktion = std::bind(funktion2, this);
        }
};
</code></pre>
<p>Dafür musst du den Header <code>&lt;functional&gt;</code> einbinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394903</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 16 Apr 2014 17:06:00 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger wie casten? on Thu, 17 Apr 2014 09:35:15 GMT]]></title><description><![CDATA[<p>Frageman123 schrieb:</p>
<blockquote>
<p>ich hoffe ihr könnt mir helfen.</p>
</blockquote>
<p>Arcoth hat zwar schon eine mögliche Lösung genannt, ich finde es aber besser wenn sagt, warum etwas nicht klappt.</p>
<p>Dies ist ein Funktionszeiger:</p>
<p>Frageman123 schrieb:</p>
<blockquote>
<pre><code>typedef void (*Mytypdef)();
</code></pre>
</blockquote>
<p>Sobald du mit nicht-statischen Funktionen von Klassen arbeitest (häufig auch als Methoden bezeichnet), reicht das nicht. Eine Klasse ist ja nur eine Schablone für konkrete Objekte. Nehmen wir mal an du hast folgenden Fall:</p>
<pre><code>class Integer {
    private:
        int wert;

    public:
        Integer(int wert) : wert(wert) {}
        int WertPlusZwei() { return wert + 2; }
}

int main()
{
    Integer a(1), b(4);
}
</code></pre>
<p>Wenn du nun einen Funktionszeiger auf die Methode &quot;WertPlusZwei&quot; anlegen würdest. Was würdest du als Ergebnis erwarten? Es fehlt der Objektbezug. Willst du es nun auf a oder b anwenden? Was fehlt ist der &quot;this&quot;-Zeiger, der Verweis auf das Objekt. Dies ist der große Unterschied zwischen Funktionen und Methoden. Falls du noch mehr dazu wissen willst, such mal nach &quot;C++ pointer to member function&quot;.</p>
<p>std::function kann mit beiden Fällen umgehen, erwartet bei Methoden aber wie in Arcoths Beispiel zu sehen einen Objektverweis (hier this).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394998</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 17 Apr 2014 09:35:15 GMT</pubDate></item></channel></rss>