<?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[Nested class und Funktionspointer...]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich bin grad dabei mich mit Funktionspointern auseinander zu setzen. Als Hilfestellung für mein jetztiges Problem hab ich diesen <a href="http://www.informatik-forum.at/showthread.php?t=15545" rel="nofollow">Beitrag</a> genommen. In abgewandelter Form ergibt sich damit folgende Ausgangssituation:</p>
<pre><code class="language-cpp">class Big
{
  private:
    class Small
    {
      public:
        typedef int (Big::*BFunc)();

        Small(BFunc pF, Big *Inst)
        {
          if ((pF == NULL)||
              (Inst == NULL))
            throw ...

          Small::pFct = pF; //funktioniert alles bestens
          Small::pBig = Inst;
        }

        int action()
        {
          //Variante 1
          return *(Small::pBig).*(Small::pFct); //Compilerfehler: Big::Small::action must return a value

          //Variante 2
          *(Small::pBig).*(Small::pFct); //Big::BigsFunc() wird nicht ausgeführt
          return 0;
        }

      private:
        Big *pBig = NULL;
        BFunc pFct = NULL;
    }; //Small  

  public:
    Big()
    {
      Small S(&amp;Big::BigsFunc, this);
      S.action();
    }

  private:
    int BigsFunc();

}; //Big
</code></pre>
<p>Ich hab verschiedene Varianten ausprobiert, doch wie die Kommentare zeigen mit wenig Erfolg. Kann mir jemand weiterhelfen?</p>
<p>Thx, Maffe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193692/nested-class-und-funktionspointer</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 05:13:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193692.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Sep 2007 16:25:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 16:25:03 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich bin grad dabei mich mit Funktionspointern auseinander zu setzen. Als Hilfestellung für mein jetztiges Problem hab ich diesen <a href="http://www.informatik-forum.at/showthread.php?t=15545" rel="nofollow">Beitrag</a> genommen. In abgewandelter Form ergibt sich damit folgende Ausgangssituation:</p>
<pre><code class="language-cpp">class Big
{
  private:
    class Small
    {
      public:
        typedef int (Big::*BFunc)();

        Small(BFunc pF, Big *Inst)
        {
          if ((pF == NULL)||
              (Inst == NULL))
            throw ...

          Small::pFct = pF; //funktioniert alles bestens
          Small::pBig = Inst;
        }

        int action()
        {
          //Variante 1
          return *(Small::pBig).*(Small::pFct); //Compilerfehler: Big::Small::action must return a value

          //Variante 2
          *(Small::pBig).*(Small::pFct); //Big::BigsFunc() wird nicht ausgeführt
          return 0;
        }

      private:
        Big *pBig = NULL;
        BFunc pFct = NULL;
    }; //Small  

  public:
    Big()
    {
      Small S(&amp;Big::BigsFunc, this);
      S.action();
    }

  private:
    int BigsFunc();

}; //Big
</code></pre>
<p>Ich hab verschiedene Varianten ausprobiert, doch wie die Kommentare zeigen mit wenig Erfolg. Kann mir jemand weiterhelfen?</p>
<p>Thx, Maffe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374502</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Fri, 28 Sep 2007 16:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 16:35:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;cassert&gt;
#include &lt;iostream&gt;

class foo
{
private:
	class bar
	{
	public:
		typedef int (foo::*fnFoo)(void) const;

		bar(fnFoo, foo* ptrFoo) : m_fnFoo(fnFoo), m_ptrFoo(ptrFoo) 
        { assert(ptrFoo != NULL); }

		int call_func() const {	return (m_ptrFoo-&gt;*m_fnFoo)() };

	private:
		foo*	m_ptrFoo;
		fnFoo	m_fnFoo;
	};

public:
	foo()
    {
		bar _inst(&amp;foo::func, this);
		std::cout &lt;&lt; _inst.call_func() &lt;&lt; std::endl;
    }

private:
	int		func() const { return 5; }
};
</code></pre>
<p>... so sollte das korrekt aussehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374513</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 28 Sep 2007 16:35:39 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 16:51:25 GMT]]></title><description><![CDATA[<p>Öhm gut. Darüber muss ich jetzt erstmal meditieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374534</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Fri, 28 Sep 2007 16:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 17:08:24 GMT]]></title><description><![CDATA[<p>Naja ein Auruf sieht halt vom Prinzip so aus:</p>
<pre><code class="language-cpp">// fnFoo: Funktionszeiger: return_value (foo::*fnFoo)(param1, ...) /* const */;
//         * return_value ist im obigen Beispiel int.
// obj: Objekt das genutzt werden soll um fnFoo aufzurufen.
// param1, ... : Die Parameter in der Signatur die die Funktion aufweisen muss.
(obj.*fnFoo)(param1, ...);
</code></pre>
<p>. Da bei dir aber obj ein Pointer ist, kannst du entweder diesen Dereferenzieren:</p>
<pre><code class="language-cpp">(*ptrObj.*fnFoo)(param1, ...);
</code></pre>
<p>oder den operator-&gt; nutzen.</p>
<pre><code class="language-cpp">(ptrObj-&gt;*fnFoo)(param1, ...);
</code></pre>
<p>Und Membervariablen kann man im Kontruktor initialisieren und nicht bei der deklaration/definition.</p>
<pre><code class="language-cpp">class foo
{ 
    bar* m_ptr = NULL;
};
</code></pre>
<p>ist falsch:</p>
<pre><code class="language-cpp">class foo
{
    bar* m_ptr;
public:
    foo() : m_ptr(NULL) {}
};
</code></pre>
<p>ist korrekt.</p>
<pre><code class="language-cpp">Small::pFct
</code></pre>
<p>ehm wenn pFct static wäre, dann würde man das evtl. so machen. Ansonsten einfach pFct = . Im Kontruktor ist dem aber die Initialisierungsliste noch vorzuziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374545</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 28 Sep 2007 17:08:24 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 17:25:09 GMT]]></title><description><![CDATA[<p>Ok, also das mit dem Pointer hab ich gerafft.<br />
Aber was ist jetzt mit der Initialisierungsliste? Macht man dieses typische Zuweisungsspielchen, also mit &quot;=&quot; nicht? Oder gibt's dort noch andere Vorteile, die ich jetzt grade übersehe? <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="😕"
    /></p>
<p>Ich sollte vielleicht erwähnen, dass ich normaler Weise immer Definition von Implementation trenne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374559</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Fri, 28 Sep 2007 17:25:09 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 17:57:49 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber was ist jetzt mit der Initialisierungsliste?</p>
</blockquote>
<p>Eine Liste, in der du angeben kannst, mit welchen Parametern der Konstruktor einer Membervariable aufgerufen werden soll. Oder mit welchem Wert eine Membervariable initialisiert werden soll ... um es vereinfacht auszudrücken.</p>
<pre><code class="language-cpp">class foo
{
public:
    foo(const bar&amp; inst, bar* ptr_2) : inst(inst), ptr(ptr_2), ptr_1(NULL), primitiv(0) {}

private:
    bar inst;
    bar* ptr;
    bar* ptr_1;
    int primitiv;
};
</code></pre>
<blockquote>
<p>Macht man dieses typische Zuweisungsspielchen, also mit &quot;=&quot; nicht? Oder gibt's dort noch andere Vorteile, die ich jetzt grade übersehe? <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="😕"
    /></p>
</blockquote>
<p>Dadurch ersparst du dir den Aufruf eines Zuweisungsoperators. Wird direkt dem Kontruktor übergeben.</p>
<blockquote>
<p>Ich sollte vielleicht erwähnen, dass ich normaler Weise immer Definition von Implementation trenne.</p>
</blockquote>
<p>Man nimmt trotzdem eine Initialisierungsliste <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="😉"
    /> Geht ohne Probleme:</p>
<pre><code class="language-cpp">foo::foo(param1, ...) : m_param1(param1), ...(...) {}
</code></pre>
<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374577</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 28 Sep 2007 17:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 20:10:28 GMT]]></title><description><![CDATA[<p>Gut gut. Aber der einzige Vorteil ist jetzt, dass ich mir den Zuweisungsoperator spare? Ja? Nein? Vielleicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374639</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Fri, 28 Sep 2007 20:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Nested class und Funktionspointer... on Fri, 28 Sep 2007 20:41:27 GMT]]></title><description><![CDATA[<p>Maffe001 schrieb:</p>
<blockquote>
<p>Gut gut. Aber der einzige Vorteil ist jetzt, dass ich mir den Zuweisungsoperator spare? Ja? Nein? Vielleicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Nicht nur das, gewisse Dinge gehen nur mit einer initializer list:</p>
<pre><code class="language-cpp">class non_default_constructible
{
public:
    explicit non_default_constructible(int x)
    {
    }
};

class foo
{
public:
    foo() :
        m_ndc(42),
        m_int_const(23)
    {
    }
private:
    non_default_constructible m_ndc;
    int const m_int_const;
};
</code></pre>
<p>Versuch das mal ohne initializer-list <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/1374653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374653</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 28 Sep 2007 20:41:27 GMT</pubDate></item></channel></rss>