<?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[Zeiger auf Methoden]]></title><description><![CDATA[<p>Hi all.</p>
<p>Ich habe eine Klasse A und eine Klasse B.<br />
Von der Klasse A leite ich verschiedene Klassen ab.<br />
In Klasse B möchte ich einen Zeiger auf eine Methode in einer der abgeleiteten Klassen speichern und diese Methode möchte ich später auch aufrufen.</p>
<p>Dazu habe ich in Klasse B vereinbart:</p>
<pre><code class="language-cpp">...
typedef void (A::*Funktion)();
...
Funktion MachWas;
...
</code></pre>
<p>Wenn ich aber nun eine Klasse C habe:</p>
<pre><code class="language-cpp">class C : public A
{
public:
void DieseFunktion(){};

B MyInstance;
MyInstance.MachWas = &amp;C::DieseFunktion;
}
</code></pre>
<p>Dann sagt mir MinGW, daß er void (C::<em>)() nicht nach void (A::</em>)() konvertieren kann. Ändere ich die Zuweisung in</p>
<pre><code class="language-cpp">MyInstance.MachWas = &amp;A::DieseFunktion;
</code></pre>
<p>bekomme ich verständlicherweise die Fehlermeldung, daß DieseFunktion kein Member von A ist.</p>
<p>Gibt es eine Möglichkeit, mein Vorhaben irgendwie zu realisieren?<br />
Ziel soll sein, daß B direkt Methoden aus von A abgeleiteten Klassen aufrufen können soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235220/zeiger-auf-methoden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 06:09:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235220.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Feb 2009 07:52:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 07:52:41 GMT]]></title><description><![CDATA[<p>Hi all.</p>
<p>Ich habe eine Klasse A und eine Klasse B.<br />
Von der Klasse A leite ich verschiedene Klassen ab.<br />
In Klasse B möchte ich einen Zeiger auf eine Methode in einer der abgeleiteten Klassen speichern und diese Methode möchte ich später auch aufrufen.</p>
<p>Dazu habe ich in Klasse B vereinbart:</p>
<pre><code class="language-cpp">...
typedef void (A::*Funktion)();
...
Funktion MachWas;
...
</code></pre>
<p>Wenn ich aber nun eine Klasse C habe:</p>
<pre><code class="language-cpp">class C : public A
{
public:
void DieseFunktion(){};

B MyInstance;
MyInstance.MachWas = &amp;C::DieseFunktion;
}
</code></pre>
<p>Dann sagt mir MinGW, daß er void (C::<em>)() nicht nach void (A::</em>)() konvertieren kann. Ändere ich die Zuweisung in</p>
<pre><code class="language-cpp">MyInstance.MachWas = &amp;A::DieseFunktion;
</code></pre>
<p>bekomme ich verständlicherweise die Fehlermeldung, daß DieseFunktion kein Member von A ist.</p>
<p>Gibt es eine Möglichkeit, mein Vorhaben irgendwie zu realisieren?<br />
Ziel soll sein, daß B direkt Methoden aus von A abgeleiteten Klassen aufrufen können soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671068</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 27 Feb 2009 07:52:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 08:02:52 GMT]]></title><description><![CDATA[<p>Was ist in deinem Beispiel der Vorteil gegenüber virtuellen Methoden?<br />
Ansonsten schau mal boost::function mit boost::bind an, oder boost::signals oder sigc++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671071</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 27 Feb 2009 08:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 09:35:41 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Was ist in deinem Beispiel der Vorteil gegenüber virtuellen Methoden?<br />
Ansonsten schau mal boost::function mit boost::bind an, oder boost::signals oder sigc++.</p>
</blockquote>
<p>Ich verstehe die Frage nicht. Wie können mir hier virtuelle Methoden helfen? Die Klasse B soll von verschiedenen Klassen benutzt werden können, die sie nicht kennt. Diese verschiedenen Klassen sind/werden alle von A abgeleitet, Klasse B kennt nur Klasse A. B möchte aber Funktionen der verschiedenen Klassen aufrufen können und will deshalb einen Methodenzeiger speichern.</p>
<p>Ich würde das gerne ohne boost machen, bzw. machen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671107</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 27 Feb 2009 09:35:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 09:51:37 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Ich verstehe die Frage nicht. Wie können mir hier virtuelle Methoden helfen?</p>
</blockquote>
<p>Schau Dich mal nach dem Interface-Pattern um.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671119</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 27 Feb 2009 09:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 09:59:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22666">@Belli</a>: virtual</p>
<pre><code class="language-cpp">struct A
{
	virtual void DieseFunktion() = 0;
};

struct C : A
{
	void DieseFunktion() { std::cout &lt;&lt; &quot;C&quot;; }
};

struct D : A
{
	void DieseFunktion() { std::cout &lt;&lt; &quot;D&quot;; }
};

struct B
{
	typedef void ( A::*Funktion )();
	Funktion MachWas;
	A* Instance;

	void Call()
	{
		(Instance-&gt;*MachWas)();
	}
};

int main()
{
	C c;
	D d;
	B MyInstance;
	MyInstance.MachWas = &amp;A::DieseFunktion;
	MyInstance.Instance = &amp;c;
	MyInstance.Call();
	MyInstance.Instance = &amp;d;
	MyInstance.Call();

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1671121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671121</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 27 Feb 2009 09:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 10:49:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10754">@David_pb</a>:</p>
<p>Ja, sehr schön, diese Idee ist mir auch schon durch den Kopf gegangen. Das 'Problem' ist, Klasse A ist schon fertig, und nicht von mir.<br />
Klasse B ist ebenfalls von Klasse A abgeleitet, und kennt diese deshalb.</p>
<p>Um diesen Ansatz zu verwirklichen, müsste ich wohl so etwas wie eine 'Zwischenklasse' entwerfen, die zunächst von A erbt, und dann die benötigten virtuellen Methoden deklariert; dann alle anderen Klassen von dieser ableiten.</p>
<p>Was mich im Moment ein bißchen daran stört ist, daß ich mich dann praktisch von vornherein auf den Methodennamen festlegen muß.</p>
<p>Vielleicht mal ein bißchen mehr zum Hintergrund:<br />
A ist die Grundlage für Fensterklassen in Windows.<br />
In meinem konkreten Fall ist B eine Klasse für einen farbigen Button und C ein Anwendungsfenster - könnte auch mal ein Dialog oder ähnliches sein/werden - die einen Button (B) enthalten soll.<br />
Wenn nun der Button geklickt wird, soll er eine Methode des Parents aufrufen.<br />
Da künftig ja sicher verschieden Anwendungen entstehen werden, wird es immer wieder neue Parentklassen geben, die mindestens immer von A abgeleitet sind.<br />
Idealerweise sollte man da nicht auf einen bestimmten Methodennamen festgelegt sein, sondern einfach 'seinem' Button die Adresse einer beliebigen aufzurufenden Methode mitteilen können.</p>
<p>Wenn ich das mit den von Tachyon erwähnten Interfaces richtig im Hinterkopf habe, erspart mir das zwar die Einführung einer Zwischenklasse; man erbt AFAIK in dem Fall von zwei Klassen, wobei die zweite eben nur die virtuelle Methode deklariert - aber auch in diesem Fall steht dann der Name der Methode (in der Interface-Klasse) unumstößlich fest.</p>
<p>Habe ich das wohl so korrekt verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671163</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 27 Feb 2009 10:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 12:56:51 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Ja, sehr schön, diese Idee ist mir auch schon durch den Kopf gegangen. Das 'Problem' ist, Klasse A ist schon fertig, und nicht von mir.<br />
Klasse B ist ebenfalls von Klasse A abgeleitet, und kennt diese deshalb.</p>
</blockquote>
<p>Dann hoffe ich nur das Klasse A für Ableitung überhaupt geeignet ist (virtueller oder privater Destruktor).</p>
<p>Eine andere Möglichkeit wäre Beide Klassen in ein Proxy zu verpacken, der Wiederum die Polymorphie umsetzt (Gemeinsame Proxybasisklasse)...</p>
<p>Wie heißt es so schön: Wenn etwas nicht direkt machbar ist, füge eine Ebene der Indirektion ein.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671193</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 27 Feb 2009 12:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 11:47:29 GMT]]></title><description><![CDATA[<p>[quote=&quot;asc&quot;]</p>
<p>Belli schrieb:</p>
<blockquote>
<p>Dann hoffe ich nur das Klasse A für Ableitung überhaupt geeignet ist (virtueller oder privater Konstruktor).</p>
</blockquote>
<p>Ich weiß - mal wieder - nicht, was ein virtueller Konstruktor ist, aber die Klasse ist als Basisklasse für Windows-Objekte (Controls, Fenster, Dialoge usw.) gedacht.<br />
Ergänzend zu meinem letzten Posting ist mir noch eingefallen, daß die vorgeschlagenen Lösungsansätze nicht nur die Methodennamen, sondern auch die Anzahl festlegen.<br />
Wenn ich zB ein Fenster mit n Buttons habe, brauche ich eigentlich Methoden wie:<br />
Button1Clicked, Button2Clicked ... ButtonNClicked.<br />
Mir sausen da im Moment so Stichworte wie Adapterklasse, Funktionsobjekt ... durch den Kopf. Ich muß mal sehen, ob ich da was finde, was ich 1. verstehe und 2. gebrauchen kann ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671210</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 27 Feb 2009 11:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 12:48:46 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Ich weiß - mal wieder - nicht, was ein virtueller Konstruktor ist</p>
</blockquote>
<p>Macht nichts, gibt es eh nicht in C++ (vielleicht ja in asC++ <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="😉"
    /> SCNR).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671290</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Fri, 27 Feb 2009 12:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 12:58:00 GMT]]></title><description><![CDATA[<p>jencas schrieb:</p>
<blockquote>
<p>Macht nichts, gibt es eh nicht in C++ (vielleicht ja in asC++ <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="😉"
    /> SCNR).</p>
</blockquote>
<p>Meinte Destruktor, habe ich korrigiert xD...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671300</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 27 Feb 2009 12:58:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 17:33:14 GMT]]></title><description><![CDATA[<p>Ein virtueller Destuktor ist notwenig, um den Destruktor einer Instanz, dessen Typ man nicht kennt aufzurufen. (Eine Basisklasse muss aber bekannt sein; das ist auch das Objekt, dass den virtuellen deklariert.</p>
<pre><code class="language-cpp">struct A
{
   ~A();
};

struct B : A
{
   ~B(){}
};

B* b = new B;
A* a = b;

delete a; //zerstört b korrekt
</code></pre>
<p>Als virtuellen Konstruktor wird manchmal die Technik gennant, wenn man in der Basisklasse eine virtuelle Funktion Clode o.ä anbietet, welche dann überschrieben wird (von der ableitenden Klasse) und dann ist es möglich ein Objekt ohne seinen genauen Typen zu kennen zu erzeugen.</p>
<pre><code class="language-cpp">struct A
{
 A* Clone ();
};

struct B : A
{
 B* Clone (){ return new B; }
};

B* b = new B;
A* a = b;
A* a2 = a-&gt;clone(); //erzeugt ein neues B
</code></pre>
<p>Zumindest den virtuellen Destruktor sollte dir schon einmal in einem C++ Buch begegnet sein, sofern es Vererbung behandelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671495</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 27 Feb 2009 17:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 19:37:06 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Zumindest den virtuellen Destruktor sollte dir schon einmal in einem C++ Buch begegnet sein, sofern es Vererbung behandelt.</p>
</blockquote>
<p>Selbstverständlich, hier war aber die Rede von einem virtuellen Konstruktor. Es wäre schön, wenn jetzt noch jemand zum ursprünglichen Problem was sagen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671594</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 27 Feb 2009 19:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden on Fri, 27 Feb 2009 19:58:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22666">@Belli</a>,<br />
Entweder du setzt das hier um:</p>
<p>asc schrieb:</p>
<blockquote>
<p>Wie heißt es so schön: Wenn etwas nicht direkt machbar ist, füge eine Ebene der Indirektion ein.</p>
</blockquote>
<p>Oder du nimmst Boost.Function und Boost.Bind:</p>
<pre><code class="language-cpp">class Foo
{
private:
  boost::function&lt;void()&gt; m_function;

public:
  template&lt;typename ClassT&gt;
  void set(void (ClassT::*func)(), ClassT* obj)
  {
    A const* a = obj; // Prüfen ob ClassT von A abgeleitet ist.
                      // Gäbe wahrscheinlich noch besser Methoden,
                      // für eine Überprüfung, bin aber zu faul
                      // mir dazu Gedanken zu machen.

    m_function = boost::bind(func, obj); // Setzen.
  }
};
</code></pre>
<p>Falls Boost.Function und Boost.Bind noch eine Stufe zu hoch sind, dann wird es problematisch.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671605</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 27 Feb 2009 19:58:42 GMT</pubDate></item></channel></rss>