<?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[[gelöst] ausgelagerte Klassenmethoden]]></title><description><![CDATA[<p>Hallo,<br />
ich habe schon einige Erfahrung mit delphi, und versuche mich jetzt bisschen in C++.</p>
<p>in delphi kann man bei Klassen (bzw. deren Objekten) vom Hauptprogramm funktionszeiger hinterlegen. diese werden klassenintern aufgerufen, befinden sich aber nicht in der gleichen datei wie die klassendefinition. weiterhin wird bei diesen Methoden ein Instanzzeiger mitgeliefert.</p>
<p>gibt es sowas auch in C++? wenn ja, wie nennt sich das genau und wo finde ich sowas?</p>
<p>in delphi sieht das z.b. so aus:</p>
<p>Definition der klasse:</p>
<pre><code>TNotify=procedure() of object; //typ des Funktionszeigers; of object besagt, dass bei der methode auch ein Pointer auf die Instanz übergeben wird

class TBlah(TBlubb)
private
  FNotify:TNotify; //variable für funktionszeiger
  procedure DoNotify; //klasseninterne Methode zum aufrufen der referenzierten funktion
public
  property Notify:TNotify read FNotify write FNotify; //das property zum setzen des funktionszeigers
end;

procedure TBlah.DoNotify;
begin
  if assigned(FNotify) then FNotify; //wenn funktionszeiger gesetzt ist, die Funktion aufrufen
end;
</code></pre>
<p>im Hauptprogramm erstellt man eine entsprechende methode und weist diese dem Objekt zu:</p>
<pre><code>procedure BlahEvent(Sender:TObject);//hier plötzlich ein Parameter =&gt; Objekt-Referenz
begin
  //mache irgendetwas
end;

//zuweisung des events
myBlah.Notify=BlahEvent;
</code></pre>
<p>jedesmal, wenn klassenintern DoNotify aufgerufen wird, wird die im Hauptprogramm befindliche BlahEvent-Methode mit ausgeführt.somit kann die Klassendefinition universeller verwendet werden.</p>
<p>wie würde das in C++ aussehen?</p>
<p>ich habe schon eine weile rumgesucht, auch funktionszeiger gefunden, aber da fehlt mir der instanz-zeiger. gut, man könnte diesen explizit mitgeben, aber evtl gibt es ja schon ein fertiges Konstrukt.<br />
ich hoffe, ich habe das verständlich dargelegt.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243074/gelöst-ausgelagerte-klassenmethoden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 00:33:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243074.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Jun 2009 22:46:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Wed, 29 Sep 2010 17:54:50 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe schon einige Erfahrung mit delphi, und versuche mich jetzt bisschen in C++.</p>
<p>in delphi kann man bei Klassen (bzw. deren Objekten) vom Hauptprogramm funktionszeiger hinterlegen. diese werden klassenintern aufgerufen, befinden sich aber nicht in der gleichen datei wie die klassendefinition. weiterhin wird bei diesen Methoden ein Instanzzeiger mitgeliefert.</p>
<p>gibt es sowas auch in C++? wenn ja, wie nennt sich das genau und wo finde ich sowas?</p>
<p>in delphi sieht das z.b. so aus:</p>
<p>Definition der klasse:</p>
<pre><code>TNotify=procedure() of object; //typ des Funktionszeigers; of object besagt, dass bei der methode auch ein Pointer auf die Instanz übergeben wird

class TBlah(TBlubb)
private
  FNotify:TNotify; //variable für funktionszeiger
  procedure DoNotify; //klasseninterne Methode zum aufrufen der referenzierten funktion
public
  property Notify:TNotify read FNotify write FNotify; //das property zum setzen des funktionszeigers
end;

procedure TBlah.DoNotify;
begin
  if assigned(FNotify) then FNotify; //wenn funktionszeiger gesetzt ist, die Funktion aufrufen
end;
</code></pre>
<p>im Hauptprogramm erstellt man eine entsprechende methode und weist diese dem Objekt zu:</p>
<pre><code>procedure BlahEvent(Sender:TObject);//hier plötzlich ein Parameter =&gt; Objekt-Referenz
begin
  //mache irgendetwas
end;

//zuweisung des events
myBlah.Notify=BlahEvent;
</code></pre>
<p>jedesmal, wenn klassenintern DoNotify aufgerufen wird, wird die im Hauptprogramm befindliche BlahEvent-Methode mit ausgeführt.somit kann die Klassendefinition universeller verwendet werden.</p>
<p>wie würde das in C++ aussehen?</p>
<p>ich habe schon eine weile rumgesucht, auch funktionszeiger gefunden, aber da fehlt mir der instanz-zeiger. gut, man könnte diesen explizit mitgeben, aber evtl gibt es ja schon ein fertiges Konstrukt.<br />
ich hoffe, ich habe das verständlich dargelegt.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725346</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Thu, 11 Jun 2009 22:52:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

typedef void (*funktionszeiger)();

struct bla
{
        funktionszeiger funcptr;
};

void funktion()
{
}

int main()
{
        bla B;
        B.funcptr = &amp;funktion;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1725350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725350</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Thu, 11 Jun 2009 22:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Thu, 11 Jun 2009 22:58:49 GMT]]></title><description><![CDATA[<p>wow, das ging ja schnell..<br />
probiere das morgen gleich aus, danke schonmal <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>an den instanzpointer komme ich nicht so einfach ran (also innerhalb der funktion), oder?</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725351</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Thu, 11 Jun 2009 22:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Fri, 12 Jun 2009 21:12:33 GMT]]></title><description><![CDATA[<p>ich habe heute mal so überlegt...vielleicht ist meine Herangehensweise falsch.<br />
bin diesbezüglich von delphi geprägt.</p>
<p>eventuell sollte ich die Event-Methoden in der Basis-Klasse nur protected oder sogar abstrakt machen (wenn das in C geht) und in der Main-Unit eine Ableitung erstellen, wo ich die Methoden mit Code fülle...</p>
<p>vielleicht auch ganz anders <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>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725816</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Fri, 12 Jun 2009 21:12:33 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Fri, 12 Jun 2009 21:16:39 GMT]]></title><description><![CDATA[<p>WTF hast du denn vor? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
And WTH ist eine Main-Unit?<br />
aber zumindest kommt mir protected und ableiten sehr bekannt vor <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="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725818</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Fri, 12 Jun 2009 21:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Fri, 12 Jun 2009 21:33:37 GMT]]></title><description><![CDATA[<p>ich habe mir eine Klasse (bzw. mehrere) geschrieben, um das Erstellen eines stinknormalen windows-fensters (und Unterkomponenten) zu kapseln. Für diverse &quot;Ereignisse&quot;, sei es WM_Create,WM_Paint,... möchte ich halt gerne im Hauptprogramm (Main-Unit = Quelldatei mit der Nachrichtenschleife = main.cxx) Code ausführen.<br />
z.b. sollen in der Haupt-Quellcode-Datei die verschiedenen Klassen (bzw. deren Objekte) zusammengebracht werden.</p>
<p>um mal ein direktes Beispiel zu bringen...</p>
<p>ich habe ein Treeview,<br />
dort drin Items,<br />
beim Doppelklick auf ein Item soll eine Funktion im Hauptprogramm ausgeführt werden. welches das aktuelle TreeItem auslesen muss. diese Routine muss also wissen, von welchem &quot;Fenster&quot; (in dem Fall das Treeview, könnten ja z.b. auch mehrere sein) das Event kommt, um das markierte Item auszulesen und mit dessen Daten die Funktion (z.b. anderes Programm aufrufen) aufruft.</p>
<p>ich möchte den Code (was soll beim doppelklick gemacht werden) ungern in die Basisklasse einbauen, um diese universell zu halten.</p>
<p>habe meinen bisherigen Code mal <a href="http://rapidshare.de/files/47515312/first.zip.html" rel="nofollow">hier</a> hochgeladen.<br />
In der tree.cxx/.h habe ich die Event-Methoden schon vorbereitet (DoXxxx).</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725826</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Fri, 12 Jun 2009 21:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Fri, 12 Jun 2009 21:36:49 GMT]]></title><description><![CDATA[<p>Wie wärs wenn du globale funktionen verwendest?</p>
<p>Die deklarierst du irgendwo und im header machst du ein<br />
extern &lt;protyp der funktion&gt;<br />
zB<br />
extern void tu_was_bei_doppelclick();</p>
<p>dann bindest du den header in treeview.cxx ein und führst<br />
tu_was_bei_doppelclick();<br />
(in Callback funktion oder keine Ahnung wie WinAPI tickt) aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725828</guid><dc:creator><![CDATA[Pigeon]]></dc:creator><pubDate>Fri, 12 Jun 2009 21:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Tue, 16 Jun 2009 09:58:19 GMT]]></title><description><![CDATA[<p>Der Vorschlag mit dem Callback gefällt mir nicht so ganz, da ich versuche das in OOP zu realisieren.wie man erkennen kann, hab ich sogar die API-Callback nur auf einen Wrapper innerhalb meiner Klasse umgebogen, um möglichst viel Code in der Klasse selbst zu haben.</p>
<p>ich habe versucht das mit der Überschreib-Variante zu realisieren, leider wird die überschreibende Methode nicht aufgerufen. unter delphi ist dies (nach dem direkten Zuweisen eines Methodenzeigers) die gängige Methode um Events mit eigenem Code zu hinterlegen, ohne in die Basisklassen-Definition einzugreifen.<br />
die Ursprungsmethode wird aufgerufen.</p>
<p>ich hab die aktuelle Variante mal hier hochgeladen: <a href="http://www.filedropper.com/first" rel="nofollow">http://www.filedropper.com/first</a></p>
<p>Ich kann mir nicht vorstellen, dass es unter C++ keine Möglichkeit gibt, dieses für mein Verständnis so simple Problem auf OOP-Ebene zu lösen.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727466</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Tue, 16 Jun 2009 09:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Tue, 16 Jun 2009 10:05:51 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>Der Vorschlag mit dem Callback gefällt mir nicht so ganz, da ich versuche das in OOP zu realisieren.</p>
</blockquote>
<p>Du willst ein callback also verwende auch eins. OOP hat nichts mit klassen und methoden zu tun.</p>
<p>schau dir das event handling von boost::signal mal an. Ansonsten gibts noch das event handling von java swing. es gibt viele möglichkeiten und du musst nur daran denken _was_ du tun willst und nicht _wie_. denn das _wie_ diktiert deine plattform.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727467</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 16 Jun 2009 10:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Tue, 16 Jun 2009 10:43:52 GMT]]></title><description><![CDATA[<p>Observerpattern heißen die &quot;OOP-Callbacks&quot;</p>
<p><a href="http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)" rel="nofollow">http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727486</guid><dc:creator><![CDATA[dafuture]]></dc:creator><pubDate>Tue, 16 Jun 2009 10:43:52 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Tue, 16 Jun 2009 17:41:39 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>gibt es sowas auch in C++? wenn ja, wie nennt sich das genau und wo finde ich sowas?</p>
</blockquote>
<p>Objektgebundene Methodenzeiger gibt es in C++ nicht, zumindest nicht als Sprachfeature. Als Alternative sieh dir boost::signal&lt;&gt;, wie von Shade vorgeschlagen, oder std::tr1::function&lt;&gt; an. Wenn es in der Effizienz einigermaßen in der Nähe der Methodenzeiger von Delphi sein soll, gäbe es noch die <a href="http://www.codeproject.com/KB/cpp/FastDelegate.aspx" rel="nofollow">Fast Delegates</a>.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ansonsten gibts noch das event handling von java swing.</p>
</blockquote>
<p>... das sich aber in C++ mangels anonymer Klassen nicht eben anbietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727760</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 16 Jun 2009 17:41:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] ausgelagerte Klassenmethoden on Thu, 18 Jun 2009 08:53:58 GMT]]></title><description><![CDATA[<p>ich habe die OnDblClick-Methode in der basis-klasse einfach nur als virtual deklariert und schon kann ich sie so überschreiben, wie ich das will. die Methode in der Abgeleiteten Klasse wird durch die Wndproc der Basisklasse ordnungsgemäß aufgerufen.<br />
Danke trotzdem für die Antworten.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728635</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Thu, 18 Jun 2009 08:53:58 GMT</pubDate></item></channel></rss>