<?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 mit static Memberfunktion]]></title><description><![CDATA[<p>Der Compiler gibt mir folgenden Fehler &quot;cannot call member function 'Example::void foo()' without object&quot;.</p>
<p>Dieser Code wirft den Fehler:</p>
<pre><code>Class example {
static const double bar() {
   void foo();
   return 1.;
}

void foo(){//Code}
};
</code></pre>
<p>Wieso kann ich die Memberfunktion foo() nicht ohne Objekt aufrufen. Wie kann ich mein Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272846/problem-mit-static-memberfunktion</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 11:37:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272846.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Aug 2010 09:31:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 09:31:26 GMT]]></title><description><![CDATA[<p>Der Compiler gibt mir folgenden Fehler &quot;cannot call member function 'Example::void foo()' without object&quot;.</p>
<p>Dieser Code wirft den Fehler:</p>
<pre><code>Class example {
static const double bar() {
   void foo();
   return 1.;
}

void foo(){//Code}
};
</code></pre>
<p>Wieso kann ich die Memberfunktion foo() nicht ohne Objekt aufrufen. Wie kann ich mein Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944532</guid><dc:creator><![CDATA[MasterG87]]></dc:creator><pubDate>Thu, 26 Aug 2010 09:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 10:01:56 GMT]]></title><description><![CDATA[<p>Deine Erklärungen, die Fehlermeldung und dein Programmcode passen nicht zusammen und dein Beispielcode ist zudem noch voller weiterer Fehler. Überall davon kann die Ursache deines Problems sein.</p>
<p>Es ist natürlich unmöglich von einer statischen Memberfunktion eine nicht-statische Memberfunktion aufzurufen. Das sollte offensichtlich sein. Bei deinem Beispiel ist foo jedoch eine freie Funktion, was kein Problem darstellen würde. Andererseits ist dein Funktionsaufruf total falsch, so geht das nicht.</p>
<p>Gibt mal wirklich 1:1 den Code der den Fehler verursacht, die Fehlermeldung und eine Beschreibung was du machen willst.</p>
<p>P.S.: Und const double als Rückgabewert? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Was soll das denn werden?</p>
<p>edit: Ups, deine Klammerung hat mich verwirrt. foo ist bei dir ja doch eine Memberfunktion. Dann vergiss meinen Kommentar zu freien Funktionen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <strong>Lies stattdessen die Antwort von asc.</strong> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944537</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 26 Aug 2010 10:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 09:55:58 GMT]]></title><description><![CDATA[<p>MasterG87 schrieb:</p>
<blockquote>
<p>Wieso kann ich die Memberfunktion foo() nicht ohne Objekt aufrufen. Wie kann ich mein Problem lösen?</p>
</blockquote>
<p>Ich glaube fast, das dir etwas beim Verständnis zum Unterschied zwischen statischen und nicht-statischen Methoden, oder dem Unterschied zwischen Klassen und Instanzen/Objekten fehlt.</p>
<p>Eine statische Methode/Membervariable existiert nur einmal pro Klasse. Eine Instanz bzw. ein Objekt hält aber seine eigenen Werte (nicht-statische Membervariablen). Und jede nicht-statische Methode benötigt daher auch einen Verweis auf die jeweilige Instanz.</p>
<p>Du musst dir deine Methode example::foo wie folgt vorstellen:</p>
<pre><code class="language-cpp">void foo(example * this) // this =&gt; Zeiger auf die Daten der Instanz
{
}
</code></pre>
<p>Jede nicht-statische Methode benötigt diesen this-Zeiger, auch wenn du ihn nicht selbst angibst, sondern dies in den Compilertiefen für dich umgesetzt wird.</p>
<p>Und statische Methoden haben keinen this-Zeiger, da sie keinerlei Ahnung von den Objekten/Instanzen haben.</p>
<p>Und hier dein Code nochmal sauber:</p>
<pre><code class="language-cpp">class example  // class wird klein geschrieben.
{
    static const double bar()
    {
         foo(); // Fehler (und das void davor ist falsch, du deklarierst hier
                // ja keine Methode, sondern verwendest sie.
         return 1.;
    }

    void foo()
    {
        // Code &lt;-- Ein solcher Kommentar macht alles (auch die dahinter stehende
        //          geschweifte Klammer zum Kommentar.
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1944544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944544</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Aug 2010 09:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 10:18:31 GMT]]></title><description><![CDATA[<p>MasterG87 schrieb:</p>
<blockquote>
<pre><code>Class example {
static const double bar() {
   foo();
   return 1.;
}
void foo(){//Code}
};
</code></pre>
</blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Es ist natürlich unmöglich von einer statischen Memberfunktion eine nicht-statische Memberfunktion aufzurufen. Das sollte offensichtlich sein.</p>
</blockquote>
<p>Das wird wahrscheinlich das Problem sein, da es für mich nicht offensichtlich war. Wie kann ich das denn umgehen?</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Bei deinem Beispiel ist foo jedoch eine freie Funktion, was kein Problem darstellen würde. Andererseits ist dein Funktionsaufruf total falsch, so geht das nicht.</p>
</blockquote>
<p>Wieso ist foo ein freie Funktion? Sie steht doch mit in der Klasse drin und müsste dadurch eine Klassenfunktion sein. Den Funktionsaufruf habe ich im obigen Code natürlich verbessert.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Gibt mal wirklich 1:1 den Code der den Fehler verursacht, die Fehlermeldung und eine Beschreibung was du machen willst.<br />
P.S.: Und const double als Rückgabewert? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Was soll das denn werden?</p>
</blockquote>
<p>Ich dachte ich schreibe mal einfachen Beispiel Code der meinen Fehler darstellt, deswegen auch das völlig willkürliche const double:-)<br />
Ich versuche jetzt mal meinen Orginalcode gekürzt wiederzugeben:</p>
<pre><code>//Die Methode find_min liegt in einer externen Bibliothek und hat folgenden Prototyp: template&lt;typename funct_der&gt; double find_min(const funct_der&amp; der); 

bool Super::operator()(Particle_ &amp;first, Particle_ &amp;second)
{
    //Code
    double tmp = find_min(&amp;getDeriv); 
    //Code
    return true;
}

// Diese Funktion ist im hpp-File static deklariert worden.
const column_vector Super::getDeriv(const column_vector&amp; alphaarg) {
    //Code
    gradF(alpha1,alpha2,gradF1,gradF2); //Memberfunktion der Klasse Super 
    column_vector res;
    //Code
    return res;
}

void Super::gradF(Scalar&amp; alpha1,Scalar&amp; alpha2,Scalar&amp; gradF1,Scalar&amp; gradF2) {
    //Code
    gradF1 = 1;
    gradF2 = 1;
}
</code></pre>
<p>Da ich in einem großen Projekt arbeite bin ich an den obigen Aufbau ziemlich gebunden. Der obige Code wirft folgenden Fehler:<br />
&quot;error: cannot call member function 'void Super::gradF(Scalar&amp;, Scalar&amp;, Scalar&amp;, Scalar&amp;)' without object&quot;.<br />
Wie kann ich das Ganze zum laufen bringen? Die Funktion getDeriv müsste in meinem Projekt nicht unbedingt static sein. Ich hab das nur gemacht um Compilerfehler zu vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944557</guid><dc:creator><![CDATA[MasterG87]]></dc:creator><pubDate>Thu, 26 Aug 2010 10:18:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 10:27:29 GMT]]></title><description><![CDATA[<p>In einer statischen Funktion kann man nie nicht-statische Funktion aufrufen, weil eine statisch Funktion eine Klassenzugehörigkeit (du brauchst kein Objekt um darauf zuzugreifen) und eine statische Funktion eine Objektzugehörigkeit (Du brauchst stets ein Objekt umd darauf zuzugreifen) hat.</p>
<p>Zudem kannst du dir das &quot;const&quot; bei return-by-value (bei primitiven Typen) sparen weil hierbei das Zurückgegebene per Definition ein <strong>rvlaue</strong> ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944563</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 26 Aug 2010 10:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 10:32:33 GMT]]></title><description><![CDATA[<p>Es ist ein großer Unterschied zwischen static und non-static. Eine Funktion in static ändern um Compilerfehler zu verhindern ist Käse...<br />
nicht-statische Funktionen brauchen immer ein Objekt, auf dem sie aufgerufen werden. Statische Funktionen nimmst du dann, wenn die Funktion logisch zu der Klasse gehört, aber ohne Instanz einer solchen funktioniert. Das können dann Factories sein, oder Vereinfachungen bei Umwandlungen, usw.<br />
Aber willkürlich eine Funktion als static umdeklarieren geht definitiv nicht - oder was würdest du sagen, wenn ein Lebensmittelhändler einfach sagt &quot;Dumme Schweinegrippepanik, die Leute kaufen nur noch Rind und Pute - deklarier ich einfach mein Schwein als Pute, damit ich nicht so viel Gammelfleisch wegwerfen muss&quot;...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944568</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 26 Aug 2010 10:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 10:57:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">/*
    Um dir mal den Unterschied zwischen Objekt- und Klassenzugehörigkeit näher zu bringen ;-)
*/

#include &lt;iostream&gt;
using namespace std;

class Foo
{
    public:
        /*
            objektzugehörig:
                Jedes Objekt, das du von dieser Klasse erstellst, hat ihr eigenes Attribut 'i'.
        */
        int i;

        /*
            klassenzugehörig:
                Statische Elemente (wie 'si') existieren genau 1x in einer Klasse.
                Sie sind unabhängig von Objekten, d.h. sie exisitern, auch wenn keine Objekt dieser Klasse erzeugt wird.
        */
        static int si;

        /*
            'si' kannst du in einem Konstruktor nicht benutzen, weil ein Konstruktor für Objekte da ist,
             er initialisiert Objekte einer Klasse.

            'si' muss somit außerhalb der Klasse initialisiert werden.
        */
        Foo() : i(7) {} // Initialisierungsliste, die das objektzugehörige Attribut 'i' initialisiert.
};

/*
    Initialisierung des statischen Elements 'si'.
*/
int Foo::si = 7;

int main()
{
    Foo objekt1;
    Foo objekt2;

    cout &lt;&lt; objekt1.i &lt;&lt; endl;
    cout &lt;&lt; objekt2.i &lt;&lt; endl;
    cout &lt;&lt; Foo::si &lt;&lt; endl;

    /*
        Es spircht allerdings nichts dagegen, etwas Klassenzugehöriges mittels Objekt zu benutzen,
        allerdings macht man das i.A. nicht, deswegen bekommst du dabei normal auch eine Warnung vom Compiler.
        Andersrum geht es wie gesagt nicht, da man für etwas Objektzugehöriges stets ein Objekt benötigt.
    */
    cout &lt;&lt; objekt1.si;

    getchar();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1944576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944576</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 26 Aug 2010 10:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 11:21:47 GMT]]></title><description><![CDATA[<p>MasterG87 schrieb:</p>
<blockquote>
<pre><code>//Die Methode find_min liegt in einer externen Bibliothek und hat folgenden Prototyp: template&lt;typename funct_der&gt; double find_min(const funct_der&amp; der); 
  
bool Super::operator()(Particle_ &amp;first, Particle_ &amp;second)
{
    //Code
    double tmp = find_min(&amp;getDeriv); 
    //Code
    return true;
}

// Diese Funktion ist im hpp-File nun nicht mehr static deklariert.
const column_vector Super::getDeriv(const column_vector&amp; alphaarg) {
    //Code
    gradF(alpha1,alpha2,gradF1,gradF2); //Memberfunktion der Klasse Super 
    column_vector res;
    //Code
    return res;
}

void Super::gradF(Scalar&amp; alpha1,Scalar&amp; alpha2,Scalar&amp; gradF1,Scalar&amp; gradF2) {
    //Code
    gradF1 = 1;
    gradF2 = 1;
}
</code></pre>
<p>Da ich in einem großen Projekt arbeite bin ich an den obigen Aufbau ziemlich gebunden. Der obige Code wirft folgenden Fehler:<br />
&quot;error: cannot call member function 'void Super::gradF(Scalar&amp;, Scalar&amp;, Scalar&amp;, Scalar&amp;)' without object&quot;.<br />
Wie kann ich das Ganze zum laufen bringen? Die Funktion getDeriv müsste in meinem Projekt nicht unbedingt static sein. Ich hab das nur gemacht um Compilerfehler zu vermeiden.</p>
</blockquote>
<p>Ok ich habe jetzt eingesehen, dass static in diesem Kontext nicht sinnvoll ist. Danke für die Erklärung des Konzepts.<br />
Wenn ich bei meinem Code das static weglasse, ergibt sich folgender Fehler:<br />
&quot;error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&amp;Super::getFunc'&quot;<br />
Wie kann ich meinen obigen Code nun zum laufen bringen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944593</guid><dc:creator><![CDATA[MasterG87]]></dc:creator><pubDate>Thu, 26 Aug 2010 11:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 11:35:14 GMT]]></title><description><![CDATA[<p>Z.B. boost::bind. Ändert aber nichts an der Tatsache, dass du ein Objekt brauchst, wenn du eine nicht-statische Memberfunktion aufrufen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944600</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 26 Aug 2010 11:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 11:49:49 GMT]]></title><description><![CDATA[<p>Ich hab jetzt boost:bind gegoogelt, sehe aber nicht wie mir das bei meinem Problem<br />
helfen soll. Kannst du es noch etwas genauer erklären?<br />
Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944607</guid><dc:creator><![CDATA[MasterG87]]></dc:creator><pubDate>Thu, 26 Aug 2010 11:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 26 Aug 2010 12:08:50 GMT]]></title><description><![CDATA[<p>Hast du auch nach &quot;boost::bind with member functions&quot; o.Ä gesucht?<br />
Hier ein Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;iostream&gt;

template &lt;typename Predicate&gt;
void start(Predicate p)
{
    p();
}

struct Runner {
    void run() {
        std::cout &lt;&lt; &quot;Running...&quot; &lt;&lt; std::endl;
    }
};

int main() {
    Runner r;
    boost::function&lt;void()&gt; fun = boost::bind(&amp;Runner::run, &amp;r);
    start(fun);
}
</code></pre>
<p>Du gibst dann in Super::operator() statt einem eigens angelegten Objekt (obiges &quot;r&quot;) wohl einfach &quot;this&quot; mit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944619</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 26 Aug 2010 12:08:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Fri, 27 Aug 2010 09:54:18 GMT]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>das von Dweb gezeigte Beispiel finde ich sehr gut beschrieben,<br />
man könnte das in die FAQ mitaufnehmen ...</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944932</guid><dc:creator><![CDATA[FAQ]]></dc:creator><pubDate>Fri, 27 Aug 2010 09:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit static Memberfunktion on Thu, 02 Sep 2010 07:17:52 GMT]]></title><description><![CDATA[<p>Ich habe meine Problem jetzt wie folgt gelöst:<br />
Ich übergebe boost::bind(&amp;Super::getDeriv,this,_1):</p>
<pre><code class="language-cpp">//Die Methode find_min liegt in einer externen Bibliothek und hat folgenden Prototyp: template&lt;typename funct_der&gt; double find_min(const funct_der&amp; der); 

bool Super::operator()(Particle_ &amp;first, Particle_ &amp;second)
{
    //Code
    double tmp = find_min(boost::bind(&amp;Super::getDeriv,this,_1)); 
    //Code
    return true;
}

// Diese Funktion ist im hpp-File nun nicht mehr static deklariert.
const column_vector Super::getDeriv(const column_vector&amp; alphaarg) {
    //Code
    gradF(alpha1,alpha2,gradF1,gradF2); //Memberfunktion der Klasse Super 
    column_vector res;
    //Code
    return res;
}

void Super::gradF(Scalar&amp; alpha1,Scalar&amp; alpha2,Scalar&amp; gradF1,Scalar&amp; gradF2) {
    //Code
    gradF1 = 1;
    gradF2 = 1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1947198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947198</guid><dc:creator><![CDATA[MasterG87]]></dc:creator><pubDate>Thu, 02 Sep 2010 07:17:52 GMT</pubDate></item></channel></rss>