Here is my issue:
I'm making a game GUI API. It has a mouse listener. Lets say the mouse listener is instructed to delete whatever widget it is listening to. The problem is that, when it deletes it, the iterator is destroyed to so it crashes:
for(std::vector<AguiMouseListener*>::iterator it
= mouseListeners.begin(); it != mouseListeners.end(); ++it)
{
switch (event)
{
case AguiMouseEventArgs::AGUI_MOUSE_DOWN:
(*it)->mouseDownCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_UP:
(*it)->mouseUpCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_MOVE:
(*it)->mouseMoveCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_CLICK:
(*it)->mouseClickCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_DOUBLE_CLICK:
(*it)->mouseDoubleClickCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_WHEEL_UP:
(*it)->mouseWheelUpCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_WHEEL_DOWN:
(*it)->mouseWheelDownCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_ENTER:
(*it)->mouseEnterCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_LEAVE:
(*it)->mouseLeaveCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_HOVER:
(*it)->mouseHoverCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_DRAG:
(*it)->mouseDragCallback(mArgs);
break;
case AguiMouseEventArgs::AGUI_MOUSE_MODAL_DOWN:
(*it)->mouseModalDownCallback(mArgs);
break;
default:
break;
}
}
Is there a proper way for another object to delete what it is listening to from a callback?
Thanks
class BillButton : public AguiMouseListener {
public:
void mouseLeaveCallback(AguiMouseEventArgs &mouseArgs)
{
delete mouseArgs.getSourceWidget();
}
};