Ich habe einige Probleme mit einem Mitglied Zeiger in einer CRTP-Vorlage. Hier ist der Code eine virtuelle Aufruffunktion, die einen Mitgliedsfunktionszeiger auf eine von crtp abgeleitete Klasse aufruft.Mitglied Funktionszeiger auf abgeleitete Klasse
class KeyboardHandler {
public:
virtual void keyPressed(KeyboardKey) = 0;
virtual void keyReleased(KeyboardKey) = 0;
KeyboardHandler & operator=(const KeyboardHandler &) = default ;
};
template<class T>
class KeyboardHandlerOpti : public KeyboardHandler {
public:
using KeyboardCallback = void (T::*)(KeyboardKey key, KeyboardStatus status) ;
KeyboardHandlerOpti(KeyboardCallback defaultCallback);
virtual void keyPressed(KeyboardKey key) override final;
virtual void keyReleased(KeyboardKey key) override final ;
std::vector<KeyboardCallback> mCallbackPressed ;
std::vector<KeyboardCallback> mCallbackReleased ;
KeyboardHandlerOpti & operator=(const KeyboardHandlerOpti &) = default ;
private:
KeyboardCallback mDefaultCallback ;
};
class GlfwDefaultKeyboardHandler :
public KeyboardHandlerOpti<GlfwDefaultKeyboardHandler> {
public:
GlfwDefaultKeyboardHandler() ;
GlfwDefaultKeyboardHandler & operator=(const GlfwDefaultKeyboardHandler &) = default ;
private:
//This is type of KeyboardCallback
void drawKey(KeyboardKey key, KeyboardStatus status) ;
} ;
Die Klasse GlfwDefaultKeyboardHandler mit drawKey als KeyboardHandlerOpti :: mDefaultCallback
template<class T>
KeyboardHandlerOpti<T>::KeyboardHandlerOpti(KeyboardCallback defaultCallback) :
mDefaultCallback(defaultCallback),
mCallbackPressed(getKeyboardKeyCount(), mDefaultCallback),
mCallbackReleased(getKeyboardKeyCount(), mDefaultCallback) {
}
und Rückruf sind aufgerufen, mit
template<class T>
void KeyboardHandlerOpti<T>::keyPressed(KeyboardKey key) {
KeyboardCallback c = mCallbackPressed[getKeyValue(key)] ;
(dynamic_cast<T *>(this)->*c)(key, KeyboardStatus::ePressed) ;
//(this->*c)(key, KeyboardStatus::ePressed) ;
}
Leider habe ich einen segfault initialisiert wird, und ich bin nicht in der Lage verstehen warum. Ich habe im Debug einen interessanten Wert gefunden. Ich kann bei der Konstruktion von KeyboardHandlerOpti sehen, dass ich Dinge habe, die ich nicht wirklich verstehe.
defaultCallback Wert ist 0x4b7578 und Debuger kann den Namen der Funktion, aber mDefaultCallback ist "0x7ef360, diese Anpassung 96" und es ist der gleiche Wert in beiden Vektoren.
Also wenn mir jemand erklären kann warum ich den segfault habe wäre ich sehr glücklich.
Vielen Dank Ich habe die Warnung nicht gesehen, weil Glm so viele Warnungen generieren, weil ich -pedantische .... –