<?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[std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin relativ neu hier und bringe gleich mal ein gewichtiges problem mit <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>
<p>ich wollte eine struktur haben, mit der ich abgeleiteten klassen erlauben kann, methoden zu registrieren (in einen vector zu pushen, der in der basisklasse definiert ist) und danach mit der basisklasse diese registrierten methoden strukturiert aufrufen möchte. der intergrund dabei ist, dass für die methoden der abgeleiteten klassen viel ähnliches passiert, was ich nicht in jede abgeleitete klasse hineincoden, sondern im der basisklasse kapseln möchte.</p>
<p>so, methodenzeiger an sich sind ja kein problem. die schwierigkeit ist eher, dass die methoden der abgeleiteten klassen, sowie die der basisklasse, zwar gleiche definitionen, aber durch die verschiedene klassenzugehörigkeit unterschiedliche signaturen aufweisen.<br />
z.b.</p>
<pre><code>bool(Base::*)()
</code></pre>
<p>ist nicht gleich</p>
<pre><code>bool(Derived::*)()
</code></pre>
<p>falls noch mehr informationen benötigt werden um das problem zu lösen, lasst mich das bitte wissen <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="🙂"
    /><br />
ansonsten hoffe ich auf kreative vorschläge</p>
<p>viele grüße,<br />
Andi</p>
<p>EDIT: okay, problem wurde durch casts gelöst.</p>
<pre><code>(bool(Base::*)())&amp;Derived::method()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/284691/std-vector-von-zeigern-auf-methoden-abgeleiteter-klassen-in-basisklasse-definieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 22:06:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284691.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Apr 2011 08:56:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 09:11:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin relativ neu hier und bringe gleich mal ein gewichtiges problem mit <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>
<p>ich wollte eine struktur haben, mit der ich abgeleiteten klassen erlauben kann, methoden zu registrieren (in einen vector zu pushen, der in der basisklasse definiert ist) und danach mit der basisklasse diese registrierten methoden strukturiert aufrufen möchte. der intergrund dabei ist, dass für die methoden der abgeleiteten klassen viel ähnliches passiert, was ich nicht in jede abgeleitete klasse hineincoden, sondern im der basisklasse kapseln möchte.</p>
<p>so, methodenzeiger an sich sind ja kein problem. die schwierigkeit ist eher, dass die methoden der abgeleiteten klassen, sowie die der basisklasse, zwar gleiche definitionen, aber durch die verschiedene klassenzugehörigkeit unterschiedliche signaturen aufweisen.<br />
z.b.</p>
<pre><code>bool(Base::*)()
</code></pre>
<p>ist nicht gleich</p>
<pre><code>bool(Derived::*)()
</code></pre>
<p>falls noch mehr informationen benötigt werden um das problem zu lösen, lasst mich das bitte wissen <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="🙂"
    /><br />
ansonsten hoffe ich auf kreative vorschläge</p>
<p>viele grüße,<br />
Andi</p>
<p>EDIT: okay, problem wurde durch casts gelöst.</p>
<pre><code>(bool(Base::*)())&amp;Derived::method()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2045350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045350</guid><dc:creator><![CDATA[AndiCpp]]></dc:creator><pubDate>Wed, 06 Apr 2011 09:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 09:24:29 GMT]]></title><description><![CDATA[<p>Das Problem hört sich für mich nach einer Problemstellung für ein NVI an.</p>
<p>Ungetestet schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Base
{
public:
   void DoTheMagic()
   {
     // code gleich für jede klasse
     DoTheSpecial();
     // code gleich für jede Klasse 
   }
private:
   virtual void DoTheSpecial()
   {
     // Standard Implementierung
   }
};

class Derived : public Base
{
private:
  virtual void DoTheSpecial()
  {
     // Derived Impl;
  }
};

int main()
{
   Derived d;
   d.DoTheMagic();
}
</code></pre>
</blockquote>
<p>Edit: Nachzulesen auch in Effective C++ Tipp 35</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2045360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045360</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Wed, 06 Apr 2011 09:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 09:29:47 GMT]]></title><description><![CDATA[<p>ja, an sowas hatte ich auch gedacht. leider ermöglicht das nicht komplett die funktionalität die ich brauchte, da eine abgeleitete klasse potentiell beliebig viele methoden der form DoTheSpecial haben kann, wobei diese anzahl in den abgeleiteten klassen variiert.</p>
<p>EDIT: aber wie gesagt, problem ist bereits gelöst <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/2045364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045364</guid><dc:creator><![CDATA[AndiCpp]]></dc:creator><pubDate>Wed, 06 Apr 2011 09:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 12:13:53 GMT]]></title><description><![CDATA[<p>hier ist mal, vereinfacht, der code wie er jetzt läuft. ich hoffe damit wirds etwas klarer <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>
<pre><code class="language-cpp">class Base
{
	public:
		Base() : _registeredMethods(std::vector&lt;bool (Base::*)()&gt;()) {};
		virtual ~Base();

		void run()
		{
			registerMethods();

			std::vector&lt;bool (Base::*)()&gt;::iterator i = _registeredMethods.begin();
			for(;i != _registeredMethods.end(); i++)
			{
				if((*this.*(*i))())
					std::cout &lt;&lt; &quot;ok&quot; &lt;&lt; std::endl;
				else
					std::cout &lt;&lt; &quot;phail&quot; &lt;&lt; std::endl;
			}
		}

	protected:
		virtual registerMethod() = 0;

		std::vector&lt;bool(Base::*)()&gt; _registeredMethods;
}

class Derived : public Base
{
	public:
		Derived();
		~Derived();

	private:
		void registerMethods()
		{
			_registeredMethods.push_back((bool (Base::*)())&amp;Derived::foo);
			_registeredMethods.push_back((bool (Base::*)())&amp;Derived::bar);
		}

		bool foo()
		{
			return true;
		}

		bool bar()
		{
			return false;
		}
}

// some more derived classes follow

int main()
{
	std::vector&lt;Base*&gt; classes = std::vector&lt;Base*&gt;()
	classes.push_back(new Derived())
	// some more pointers to other derived classes are pushed back

	std::vector&lt;Base*&gt;::iterator i = classes.begin(); 
	for(;i != classes.end(); ++i) 
	{
		(*i)-&gt;run();
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2045372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045372</guid><dc:creator><![CDATA[AndiCpp]]></dc:creator><pubDate>Wed, 06 Apr 2011 12:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 10:51:57 GMT]]></title><description><![CDATA[<p>Wie wärs mit <code>function</code> und <code>bind</code> ?</p>
<pre><code class="language-cpp">#include &lt;functional&gt;
#include &lt;vector&gt;

class base
{
public:
    typedef std::tr1::function&lt;bool ()&gt; callback_type;

    virtual ~base(){}

    void run()
    {
        typedef callback_list_type::const_iterator iter_type;
        for(iter_type i(callback_list.begin()), end(callback_list.end()), i != end; ++i)
        {
            if((*i)())
            {
                std::cout &lt;&lt; &quot;Result A&quot; &lt;&lt; std::endl;
            }
            else
            {
                std::cout &lt;&lt; &quot;Result B&quot; &lt;&lt; std::endl;
            }
        }
    }

protected:
    void register_callback(callback_type const &amp; cb)
    {
        callback_list.push_back(cb);
    }

private:
    typedef std::vector&lt;callback_type&gt; callback_list_type;

    callback_list_type callback_list;

};

class derived : public base
{
public:
    derived()
    {
        this-&gt;register_callback(std::tr1::bind(&amp;derived::foo, this));
        this-&gt;register_callback(std::tr1::bind(&amp;derived::bar, this));
    }
private:
    bool foo()
    {
        return true;
    }

    bool bar()
    {
        return false;
    } 
};

int main()
{
    std::vector&lt;base*&gt; classes;
    classes.push_back(new derived())
    // some more pointers to other derived classes are pushed back

    std::vector&lt;base*&gt;::iterator i = classes.begin();
    for(;i != classes.end(); ++i)
    {
        (*i)-&gt;run();
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2045388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045388</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 06 Apr 2011 10:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 11:43:48 GMT]]></title><description><![CDATA[<p>Ich seh da noch keinen Vorteil gegenüber:</p>
<pre><code class="language-cpp">class Base
{
public:
        virtual ~Base(){}

        void run()
        {
            pre();
            if (!do_run()) cout &lt;&lt; &quot;fail&quot;;
            post();
        }

private:
        void pre();
        void post();
        virtual bool do_run() = 0;     
};

class Derived : public Base
{  
private:
        bool do_run()
        {
            return foo() &amp;&amp; bar();
        }

        bool foo()
        {
            return true;
        }

        bool bar()
        {
            return false;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2045422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045422</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 06 Apr 2011 11:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 11:54:51 GMT]]></title><description><![CDATA[<p>perfect. that's exactly what I was looking for <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="🙂"
    /><br />
thanks a lot</p>
<p>EDIT: irks... -.- ich sollte aufhören englische und deutsch foren parallel zu lesen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2045428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045428</guid><dc:creator><![CDATA[AndiCpp]]></dc:creator><pubDate>Wed, 06 Apr 2011 11:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 12:11:19 GMT]]></title><description><![CDATA[<p>@Taychon:</p>
<p>ist std::tr1 teil des C++0x standards?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2045435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045435</guid><dc:creator><![CDATA[AndiCpp]]></dc:creator><pubDate>Wed, 06 Apr 2011 12:11:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 12:13:35 GMT]]></title><description><![CDATA[<p>AndiCpp schrieb:</p>
<blockquote>
<p>@Taychon:</p>
<p>ist std::tr1 teil des C++0x standards?</p>
</blockquote>
<p>Jein. Der TR1 ist ein Entwurf für eine Biblithekserweiterung, die 2003 veröffentlicht wurde. Die meisten gängigen Compiler haben das implementiert. Das meiste vom TR1 wird so oder so ähnlich in den 0x-Standard übernommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2045438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045438</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 06 Apr 2011 12:13:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector von zeigern auf methoden abgeleiteter klassen in basisklasse definieren on Wed, 06 Apr 2011 12:15:08 GMT]]></title><description><![CDATA[<p>ah, oaky. ich hab mich nämlich grad darüber gewundert:</p>
<pre><code>error: 'tr1' is not a member of 'std'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2045440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2045440</guid><dc:creator><![CDATA[AndiCpp]]></dc:creator><pubDate>Wed, 06 Apr 2011 12:15:08 GMT</pubDate></item></channel></rss>