So arbeite ich an einem einfachen Win32-Wrapper für meine eigene Bequemlichkeit, und ich habe in ein etwas kompliziertes Problem gerannt.Mitgliedsfunktion Zeiger und Vererbung
das hat viele andere Mitglieder, aber ich lasse ein bisschen weg und lasse nur die beleidigenden Mitglieder zurück.
class Windows::AbstractWindow
{
public:
void InstallHandler(UINT msgName, void (Windows::AbstractWindow::*)(HWND, UINT, WPARAM, LPARAM));
private:
std::map<UINT, void (Windows::AbstractWindow::*)(HWND, UINT, WPARAM, LPARAM)> HandlerIndex;
};
(für den Datensatz, von Windows in diesem Fall ist ein Namensraum verschiedener Klassen und Objekte die ich gemacht habe)
nur ein bisschen böse, aber lass ich meinen Prozess und Argumentation erklären. Ich habe eine Klasse namens AbstractWindow gemacht, die die Funktionalität eines Fensters auf sehr objektorientierte Weise enthält.
Ich arbeite jetzt an einer Methode, private Mitgliederfunktionen zu nehmen und sie in einer Karte über Zeiger zu ihnen zu speichern, die durch die Windows-Nachricht identifiziert werden, die sie behandeln sollen. Wenn eine Nachricht von der Windows-Prozedur empfangen wird, durchforstet sie diese Map, um zu sehen, ob Sie einen Handler für sie installiert haben. Wenn es das hat ruft es diese Funktion auf und beendet sich. Es hat es nicht DefWindowProc aufgerufen und beendet. leicht genug.
Dieses Objekt soll jedoch niemals instanziiert werden und soll einfach geerbt und erweitert werden. Das Problem besteht darin, dass die Funktion function pointer declaration der Map vom Typ AbstractWindow ist, die es mir nicht erlaubt, Zeiger auf die Mitgliedsfunktion eines Typs zu speichern, der von AbstractWindow geerbt wurde. Zum Beispiel
class BasicWindow : public Windows::AbstractWindow
{
public:
BasicWindow()
{
InstallHandler(WM_CREATE, &create);
}
private:
void Create(HWND, UINT, WPARAM, LPARAM) {}
}
... ergibt einen Fehler:
error C2664: 'Windows::AbstractWindow::InstallHandler' : cannot convert parameter 2 from 'void (__thiscall BasicWindow::*)(HWND,MSG,WPARAM,LPARAM)' to 'void (__thiscall Windows::AbstractWindow::*)(HWND,UINT,WPARAM,LPARAM)'
weil die Zeigertypen nicht gleich sind, trotz von der Basisklasse geerbt werden. Will also jemand eine Lösung vorschlagen, während er diese Methode beibehält? Und wenn nicht, bin ich auch offen für Vorschläge, die Ihrer Meinung nach die Handhabung von Nachrichten komfortabler machen würden.
dies ignorieren, danke. –