<?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[pointer in hash_multimap speichern]]></title><description><![CDATA[<p>Ich bin dabei einen Callbackmanager zu implementieren, Dazu möchte ich beliebige Methoden (mit definiertem Methoden-header) aus beliebigen Klassen entgegennehmen und in einer hash_multimap mit einem unsigned int gepaart abspeichern. Der unsigned int soll dabei mein key sein und reflektiert einen Tastaturkey. (Ich möchte auf Keyboardtastendrücke callbacks ausführen)<br />
Dazu habe ich mir eine Callbackclasse angelegt, die auf einem Template basiert, damit ich den Klassentyp der Callbackmethode nicht kennen muss. In dieser Klasse wird dann auch der Methodenzeiger entgegengenommen und abgespeichert.<br />
Mein Callbackmanager nimmt dann einen pointer auf eine Instanz einer solchen Callbackclasse entgegen und speichert ihn mit einem unsigned int in meine hash_multimap.<br />
Das Problem:<br />
Wenn ich die Instanz der Klasse Callback direkt nutze um den gespeicherten Methodenpointer zu nutzen klappt alles wunderbar, aber wenn ich den pointer auf die Instanz in die hash_multimap packe, auslese und dann versuche die Methode auszuführen bekomme ich eine exception.<br />
Auch wenn ich versuche Membervariabeln aus meiner Callbackinstanz zu lesen, nachdem ich den pointer aus der map geholt habe bekomme ich irgendwelche wilden Werte raus. Also denke ich mal, dass der pointer hinüber ist.<br />
Hier der relevante source zum Speichern der Callbackklasse in der hash_multimap.</p>
<p>WWRCallbackManager_cl.h:</p>
<pre><code class="language-cpp">... 
stdext::hash_multimap&lt;unsigned int,WWRCallback_cl*&gt;  callbacktable; 
void RegisterCallback(unsigned int, WWRCallback_cl*); 
...
</code></pre>
<p>WWRCallbackManager_cl.cpp:</p>
<pre><code class="language-cpp">void WWRCallbackManager_cl::RegisterCallback(unsigned int key, WWRCallback_cl* cbobject) 
{ 
   callbacktable.insert(stdext::hash_multimap&lt;unsigned int,WWRCallback_cl*&gt;::value_type(key,cbobject)); 
} 

void WWRCallbackManager_cl::TickFunction() 
{ 
   stdext::hash_multimap &lt;unsigned int, WWRCallback_cl*&gt;::iterator cb_Iter; 
   if(callbacktable.size()&gt;0) 
   { 
      for ( cb_Iter = callbacktable.begin( ); cb_Iter != callbacktable.end( );cb_Iter++ ) 
      { 
         if(Vision::Key.IsPressed(cb_Iter -&gt; first)) 
         { 

            cb_Iter -&gt; second -&gt; Execute(3);   //Exception tritt hier auf 
         } 
      } 
   } 
}
</code></pre>
<p>Was genau mach ich falsch?<br />
Danke schonmal für alle Hilfe.<br />
-Jan-</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166855/pointer-in-hash_multimap-speichern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 21:07:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166855.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 Dec 2006 19:49:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to pointer in hash_multimap speichern on Sun, 03 Dec 2006 19:49:28 GMT]]></title><description><![CDATA[<p>Ich bin dabei einen Callbackmanager zu implementieren, Dazu möchte ich beliebige Methoden (mit definiertem Methoden-header) aus beliebigen Klassen entgegennehmen und in einer hash_multimap mit einem unsigned int gepaart abspeichern. Der unsigned int soll dabei mein key sein und reflektiert einen Tastaturkey. (Ich möchte auf Keyboardtastendrücke callbacks ausführen)<br />
Dazu habe ich mir eine Callbackclasse angelegt, die auf einem Template basiert, damit ich den Klassentyp der Callbackmethode nicht kennen muss. In dieser Klasse wird dann auch der Methodenzeiger entgegengenommen und abgespeichert.<br />
Mein Callbackmanager nimmt dann einen pointer auf eine Instanz einer solchen Callbackclasse entgegen und speichert ihn mit einem unsigned int in meine hash_multimap.<br />
Das Problem:<br />
Wenn ich die Instanz der Klasse Callback direkt nutze um den gespeicherten Methodenpointer zu nutzen klappt alles wunderbar, aber wenn ich den pointer auf die Instanz in die hash_multimap packe, auslese und dann versuche die Methode auszuführen bekomme ich eine exception.<br />
Auch wenn ich versuche Membervariabeln aus meiner Callbackinstanz zu lesen, nachdem ich den pointer aus der map geholt habe bekomme ich irgendwelche wilden Werte raus. Also denke ich mal, dass der pointer hinüber ist.<br />
Hier der relevante source zum Speichern der Callbackklasse in der hash_multimap.</p>
<p>WWRCallbackManager_cl.h:</p>
<pre><code class="language-cpp">... 
stdext::hash_multimap&lt;unsigned int,WWRCallback_cl*&gt;  callbacktable; 
void RegisterCallback(unsigned int, WWRCallback_cl*); 
...
</code></pre>
<p>WWRCallbackManager_cl.cpp:</p>
<pre><code class="language-cpp">void WWRCallbackManager_cl::RegisterCallback(unsigned int key, WWRCallback_cl* cbobject) 
{ 
   callbacktable.insert(stdext::hash_multimap&lt;unsigned int,WWRCallback_cl*&gt;::value_type(key,cbobject)); 
} 

void WWRCallbackManager_cl::TickFunction() 
{ 
   stdext::hash_multimap &lt;unsigned int, WWRCallback_cl*&gt;::iterator cb_Iter; 
   if(callbacktable.size()&gt;0) 
   { 
      for ( cb_Iter = callbacktable.begin( ); cb_Iter != callbacktable.end( );cb_Iter++ ) 
      { 
         if(Vision::Key.IsPressed(cb_Iter -&gt; first)) 
         { 

            cb_Iter -&gt; second -&gt; Execute(3);   //Exception tritt hier auf 
         } 
      } 
   } 
}
</code></pre>
<p>Was genau mach ich falsch?<br />
Danke schonmal für alle Hilfe.<br />
-Jan-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186465</guid><dc:creator><![CDATA[KungFool]]></dc:creator><pubDate>Sun, 03 Dec 2006 19:49:28 GMT</pubDate></item><item><title><![CDATA[Reply to pointer in hash_multimap speichern on Mon, 04 Dec 2006 08:35:26 GMT]]></title><description><![CDATA[<p>Da ist es interessant zu wissen, wo und wie du deine Callback's anlegst und registrierst. Wenn du einfach nur die Adresse einer lokalen Variable übergibst, hast du sehr schnell ein Problem ('normale' Containerklassen speichern zwar eine Kopie ihrer Elemente, aber bei Pointern ist das eine flache Kopie):</p>
<pre><code class="language-cpp">void init()
{
  WWRCallback_cl Call;
  ...
  RegisterCallback(4711,&amp;Call);
  ...
}//hier wird 'Call' wieder gelöscht und deine Hash-Map behält einen Zeiger, der ins Nirvana verweist
// -&gt; BUMM!!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1186613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186613</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 04 Dec 2006 08:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to pointer in hash_multimap speichern on Mon, 04 Dec 2006 15:55:20 GMT]]></title><description><![CDATA[<p>Hallo CStoll!<br />
Danke für deine Antwort.<br />
Also ich hab mal was ausprobiert:<br />
Wenn ich direkt in der Methode, wo ich das Objekt vom Typ Callback in die hashmap packe auch wieder danach suche, dann klappt das wunderbar.<br />
Die Klasse, die mein Hash-Objekt entgegennimmt registriert sich allerdings in der Gameengine um jeden Frame aufgerufen zu werden. Wenn ich dann in der Methode, die jeden Frame aufgerufen wird wieder in der hash_multimap alle Elemente durchgehe sind die pointer wohl falsch.<br />
Also denke ich mal, dass du mit deinem Denkansatz nicht ganz falsch liegst.</p>
<p>Hier erstelle ich meine Callbacks:</p>
<p>Gameapp.cpp</p>
<pre><code class="language-cpp">//register callbacks
   callbackmanager=new WWRCallbackManager_cl(); // create new cb manager
   callbackmanager-&gt;RegisterMovementControl(&quot;wasd&quot;,VGLK_A,VGLK_D,VGLK_W,VGLK_S);
   TWWRCallback_cl&lt;MyLandspeeder_cl&gt; testcallback; // create new cb instance
   testcallback.SetCallback(pLandspeeder,&amp;MyLandspeeder_cl::keycall); //register the cb method in the cb instance
   callbackmanager-&gt;RegisterCallback(VGLK_SPACE,&amp;testcallback); //register the callback instance with the callback manager for spacebar
</code></pre>
<p>Wie genau verhindere ich jetzt, dass mein Objektzeiger ins Nirvana zeigt?<br />
muss ich dazu einfach den callback als Membervariable von Gameapp deklarieren?<br />
Das wäre unangenehm, denn gerade wegen der Dynamik wollte ich ja den Callbackmanager haben.<br />
Oder darf ich das einfach nicht über Pointer machen?</p>
<p>Vielen dank nochmals.<br />
Gruß<br />
Jan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187019</guid><dc:creator><![CDATA[KungFool]]></dc:creator><pubDate>Mon, 04 Dec 2006 15:55:20 GMT</pubDate></item><item><title><![CDATA[Reply to pointer in hash_multimap speichern on Tue, 05 Dec 2006 07:05:42 GMT]]></title><description><![CDATA[<p>KungFool schrieb:</p>
<blockquote>
<pre><code class="language-cpp">TWWRCallback_cl&lt;MyLandspeeder_cl&gt; testcallback; // create new cb instance
testcallback.SetCallback(pLandspeeder,&amp;MyLandspeeder_cl::keycall); //register the cb method in the cb instance
callbackmanager-&gt;RegisterCallback(VGLK_SPACE,&amp;testcallback); //register the callback instance with the callback manager for spacebar
</code></pre>
</blockquote>
<p>Genau wie ich vermutet habe - du erzeugst ein lokales Callback-Objekt und das wird am Ende der Funktion wieder zerstört.</p>
<blockquote>
<p>Wie genau verhindere ich jetzt, dass mein Objektzeiger ins Nirvana zeigt?<br />
muss ich dazu einfach den callback als Membervariable von Gameapp deklarieren?<br />
Das wäre unangenehm, denn gerade wegen der Dynamik wollte ich ja den Callbackmanager haben.<br />
Oder darf ich das einfach nicht über Pointer machen?</p>
</blockquote>
<p>Du darfst das schon über Pointer machen - nur mußt du darauf achten, woher du deine Pointer bekommst (Stack-Speicher (lokale Variablen) wird am Funktionsende freigegeben, Heap-Speicher bleibt gültig, bis du ihn selber freigibst (new/delete):</p>
<pre><code class="language-cpp">TWWRCallback_cl&lt;MyLandspeeder_cl&gt;* ptest = new TWWRCallback_cl&lt;MyLandspeeder_cl&gt;; // create new cb instance
ptest-&gt;SetCallback(pLandspeeder,&amp;MyLandspeeder_cl::keycall); //register the cb method in the cb instance
callbackmanager-&gt;RegisterCallback(VGLK_SPACE,ptest); //register the callback instance with the callback manager for spacebar
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1187190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187190</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 05 Dec 2006 07:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to pointer in hash_multimap speichern on Tue, 05 Dec 2006 18:29:55 GMT]]></title><description><![CDATA[<p>Hmm ja ich hab das einfach nicht richtig instanziiert und den Pointer benutzt.<br />
So ist das natürlich genau das was ich brauche und es klappt auch.<br />
Herzlichen Dank noch einmal!<br />
Jan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187480</guid><dc:creator><![CDATA[KungFool]]></dc:creator><pubDate>Tue, 05 Dec 2006 18:29:55 GMT</pubDate></item></channel></rss>