Okay i hit another problem. When the monster dies i delete him, right? But then i get the access violation when all his functions are still being called.
Welcome to the wonderful world of programming in C++, sit back and enjoy the ride!
To avoid this problem, many developers use some form of memory management, reference counting for example is a very popular one which is also rather simple to implement
Each object which needs to be managed holds a counter (we call this a reference counter), and at the creation of your object this counter is set to 1
Besides this, these objects have 2 methods, we could call them addReference() and dropReference() for example; these methods are very simple, the addReference() method increases the reference counter by 1, and the dropReference() method decreases the counter by 1
The dropReference() method also does a check whether the reference counter is 0, when this condition is met the object gets deleted
All objects interacting with a reference counted object can now call addReference() when they need access to this object, and dropReference() when they're done with the object; this more or less guarantees that an object remains valid as long as it is needed by another object
You could apply this principle to your monster class and you could introduce a state indicating a monster is dead; when objects are interacting with a dead monster object they can drop their reference which will cause your monster to be deleted safely after the last reference has been dropped
Be aware of the fact though that this system is not perfect, some problems like cyclic references (2 objects referencing eachother which can make it impossible to get their reference count to 0) could occur