Einzelnen Beitrag anzeigen

Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#1

Speichern von pointer in hash_multimap

  Alt 3. Dez 2006, 16:07
Hallo DPler,

ich weiß zwar, dass es sich hier um ein Delphiforum handelt, aber da ich weiß, dass hier jede menge Leute zugange sind, die auch in C++ fit sind und man hier immer sehr gut geholfen wird stell ich einfach mal ne C++ Frage:

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)
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.
Mein Callbackmanager nimmt dann einen pointer auf eine Instanz einer solchen Callbackclasse entgegen und speichert ihn mit einem unsigned int in meine hash_multimap.
Das Problem:
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.
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.
Hier der relevante source zum Speichern der Callbackklasse in der hash_multimap.

WWRCallbackManager_cl.h:

Code:
...
stdext::hash_multimap<unsigned int,WWRCallback_cl*> callbacktable;
void RegisterCallback(unsigned int, WWRCallback_cl*);
...
WWRCallbackManager_cl.cpp:

Code:
void WWRCallbackManager_cl::RegisterCallback(unsigned int key, WWRCallback_cl* cbobject)
{
   callbacktable.insert(stdext::hash_multimap<unsigned int,WWRCallback_cl*>::value_type(key,cbobject));
}


void WWRCallbackManager_cl::TickFunction()
{
   stdext::hash_multimap <unsigned int, WWRCallback_cl*>::iterator cb_Iter;
   if(callbacktable.size()>0)
   {
      for ( cb_Iter = callbacktable.begin( ); cb_Iter != callbacktable.end( );cb_Iter++ )
      {
         if(Vision::Key.IsPressed(cb_Iter -> first))
         {
       
            cb_Iter -> second -> Execute(3);  //Exception tritt hier auf
         }
      }
   }
}
Was genau mach ich falsch?
Ich hoffe mal es ist verständlich was da passiert und dass C++ nicht gegen irgendwelche wichtigen Boardregeln verstößt.

Vielen Dank und tschö!
-Jan-
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat