<?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[variable funktionen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich baue mir zurzeit eine simple art Datenbank zum verwalten von Objekten. Diese will ich später als Grundlage benutzen ein oder mehrere spiele zu bauen.<br />
In dieser Datenbank gibt es eine Objekt liste welche momentan so inetwa aussieht:</p>
<pre><code class="language-cpp">class Object
{
  public:
    void Timer(); 
    HRESULT Init(char*,unsigned int Nr,/*funktionsname*/);
  private:
    unsigned int Nr;
    char *DataName;
};
</code></pre>
<p>Ich möchte das jedes Objekt eine individuelle (Timer()) funktion aufrufen kann die ich vorher zb. durch Init() bestimmt habe. In dieser sollen dann dinge wie zb. später Kollision oder Positionsänderungen bearbeitet werden.</p>
<pre><code class="language-cpp">class Object
{
public:
void Timer();
Funktion F;
}

Object::Timer()
{
  RufeFunktionAuf(F,Infosübermich);
}
</code></pre>
<p>Diese sollte dann irgendwo außerhalb der Datenbank deklariert und implementiert werden.<br />
Jetzt würde es mir helfen wenn ich wüsste wie man soetwas korrekt bezeichnet (Um danach zu suchen) / wie soetwas geht bzw. wie ihr das umsetzen würdet.</p>
<p>WinApi verwendet genau das was ich suche für die Message verarbeitung, falls meine beschreibung nicht klar ersichtlich ist führe ich das beispiel einfach mal hier auf:</p>
<pre><code class="language-cpp">INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    WNDCLASSEX wc;
    wc.lpfnWndProc = XYZ;
}

LRESULT CALLBACK XYZ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/230724/variable-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 03:54:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230724.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Dec 2008 13:46:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to variable funktionen on Wed, 31 Dec 2008 13:46:27 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich baue mir zurzeit eine simple art Datenbank zum verwalten von Objekten. Diese will ich später als Grundlage benutzen ein oder mehrere spiele zu bauen.<br />
In dieser Datenbank gibt es eine Objekt liste welche momentan so inetwa aussieht:</p>
<pre><code class="language-cpp">class Object
{
  public:
    void Timer(); 
    HRESULT Init(char*,unsigned int Nr,/*funktionsname*/);
  private:
    unsigned int Nr;
    char *DataName;
};
</code></pre>
<p>Ich möchte das jedes Objekt eine individuelle (Timer()) funktion aufrufen kann die ich vorher zb. durch Init() bestimmt habe. In dieser sollen dann dinge wie zb. später Kollision oder Positionsänderungen bearbeitet werden.</p>
<pre><code class="language-cpp">class Object
{
public:
void Timer();
Funktion F;
}

Object::Timer()
{
  RufeFunktionAuf(F,Infosübermich);
}
</code></pre>
<p>Diese sollte dann irgendwo außerhalb der Datenbank deklariert und implementiert werden.<br />
Jetzt würde es mir helfen wenn ich wüsste wie man soetwas korrekt bezeichnet (Um danach zu suchen) / wie soetwas geht bzw. wie ihr das umsetzen würdet.</p>
<p>WinApi verwendet genau das was ich suche für die Message verarbeitung, falls meine beschreibung nicht klar ersichtlich ist führe ich das beispiel einfach mal hier auf:</p>
<pre><code class="language-cpp">INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    WNDCLASSEX wc;
    wc.lpfnWndProc = XYZ;
}

LRESULT CALLBACK XYZ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1637723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637723</guid><dc:creator><![CDATA[Liech]]></dc:creator><pubDate>Wed, 31 Dec 2008 13:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to variable funktionen on Wed, 31 Dec 2008 13:58:15 GMT]]></title><description><![CDATA[<p>In C++ nimmt man dazu Funktoren, bzw. Funktionsobjekte. Die WinAPI benutzt allerdings Funktionszeiger, da es in C keine Objekte gibt.<br />
Ein kurzer Artikel:<br />
<a href="http://en.wikipedia.org/wiki/Function_object#Functors_in_C_and_C.2B.2B" rel="nofollow">http://en.wikipedia.org/wiki/Function_object#Functors_in_C_and_C.2B.2B</a></p>
<p>Ansonsten findet man dazu sicher was im C++ Primer oder Thinking in C++ 1&amp;2 (als PDF runterladbar).</p>
<p>Und falls du dich mit Funktoren und Template gut genug auskennst, dann sind diese zwei Bibliotheken von Boost deine dicksten Freunde <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="😉"
    /><br />
<a href="http://www.boost.org/doc/libs/1_37_0/libs/bind/bind.html" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/libs/bind/bind.html</a><br />
<a href="http://www.boost.org/doc/libs/1_37_0/doc/html/function.html" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/doc/html/function.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637729</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 31 Dec 2008 13:58:15 GMT</pubDate></item><item><title><![CDATA[Reply to variable funktionen on Wed, 31 Dec 2008 15:45:30 GMT]]></title><description><![CDATA[<p>Die allgemeine OOP Lösung für sowas.<br />
<a href="http://de.wikipedia.org/wiki/Publish-Subscribe" rel="nofollow">http://de.wikipedia.org/wiki/Publish-Subscribe</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637784</guid><dc:creator><![CDATA[oder]]></dc:creator><pubDate>Wed, 31 Dec 2008 15:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to variable funktionen on Wed, 31 Dec 2008 15:55:00 GMT]]></title><description><![CDATA[<p>Erstmal danke für die schnelle antwort.</p>
<p>Wenn ich das richtig verstanden habe muss man für jede funktion dieser art eine eigene klasse machen. Die kann ich (vermutlich) nur als Template der Object klasse übergeben.<br />
Jetzt ist meine frage:<br />
Wie speichere ich den functor? Zu Variablen als Templates konnte ich keine treffenden informationen finden und das unten geschriebene, was mir am logischsten erschien, mag der Compiler nicht.</p>
<pre><code class="language-cpp">class Object
{
  public:
    unsigned int GetNr(){return Nr;}
    template&lt;class TFunc&gt; HRESULT Init(char*,unsigned int Nr,TFunc);
    void Timer(int);
  private:
    GameEngine *GE;
    unsigned int Nr;
    char *DataName;
    template&lt;typename TFunc&gt; TFunc funktion; //error: data member `funktion' cannot be a member template
};

void Object::Timer(int Time)
{
  funktion();
}
</code></pre>
<p>@oder:<br />
Ich kann keinen zusammenhang zwischen dem link und meinem problem feststellen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637789</guid><dc:creator><![CDATA[Liech]]></dc:creator><pubDate>Wed, 31 Dec 2008 15:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to variable funktionen on Wed, 31 Dec 2008 16:24:48 GMT]]></title><description><![CDATA[<p>Also zuerst einmal:<br />
Falls du noch nie mit template gearbeitet hast, dann rate ich dir dringend, dir zuerst etwas Zeit zu nehmen und das Thema einmal gründlich durchzuarbeiten. Templates können recht komplex sein und man sollte relativ standfest sein, wenn man mit ihnen programmiert, sonst ärgert man sich nur noch über den Kompiler, dass er einem so viele unkenntliche Fehlermeldungen rausspuckt. <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>
<p>Für die allgemeine Speicherung von Funktoren empfehle ich die bereits erwähnt Bibliothek von Boost:<br />
<a href="http://www.boost.org/doc/libs/1_37_0/doc/html/function.html" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/doc/html/function.html</a></p>
<p>Man kann sich sowas, relativ leicht auch selber bauen:</p>
<pre><code class="language-cpp">class BasicCallable
{
protected:
  BasicCallable() { }
  virtual ~BasicCallable() { }

public:
  virtual void call() = 0;
};

template&lt;typename CalleeT&gt;
class Callable : public BasicCallable
{
public:
  typedef CalleeT Callee;

private:
  Callee m_callee;

public:
  Callable(Callee callee)
    : m_callee(callee)
  { }

  ~Callable() { }

public:
  void call() { m_callee(); }
};

class Caller
{
private:
  BasicCallable* m_callable;

public:
  template&lt;typename CallableT&gt;
  Caller(CallableT callable)
    : m_callable(0)
  {
    m_callable = new Callable&lt;CallableT&gt;(callable);
  }

  ~Caller()
  {
    delete m_callable;
  }

public:
  void foo()
  {
    // ...
    m_callable-&gt;call();
    // ...
  }
};
</code></pre>
<p>(ungetestet)<br />
Dies ist eine sehr billige Implementation. Boost.Function macht das wesentlich besser, berücksichtig zum Beispiel auch Rückgabewerte.</p>
<p>Die Lösung von &quot;oder&quot; ist übrigens nichts anderes, als dass du eine Schnittstelle anbietest. Eine abstrakte Klasse, von welcher man ableiten muss.</p>
<pre><code class="language-cpp">class Observer
{
public:
  virtual void call() = 0;
};

// Wer Informationen erhalten will, muss eine Klasse, welche von Observer ableitet, übergeben.

class Object
{
public:
  unsigned int GetNr(){return Nr;}
  HRESULT Init(char*,unsigned int Nr,Observer*);
  void Timer(int);
private:
  GameEngine *GE;
  unsigned int Nr;
  char *DataName;
  Observer* observer;
};

void Object::Timer(int Time)
{
  if(observer)
  { observer-&gt;call(); }
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637804</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 31 Dec 2008 16:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to variable funktionen on Fri, 02 Jan 2009 13:52:53 GMT]]></title><description><![CDATA[<p>Vielen dank, die &quot;oder&quot; variante hat scheinbar mein problem gelöst. Ich denke das ich besser noch warte bevor ich mich mit templates herum schlage, vorher möchte ich lieber in dingen wie klassen etc. sicher sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638349</guid><dc:creator><![CDATA[Liech]]></dc:creator><pubDate>Fri, 02 Jan 2009 13:52:53 GMT</pubDate></item></channel></rss>