[C++] error C2440: 'type cast' : cannot convert ...

Pagina: 1
Acties:

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Ik heb een klasse gemaakt die bij instantie een window creeert en beheert. Tenminste dat is de bedoeling. Bij het initialiseren is het de bedoeling dat aan de te registeren WNDCLASSEX structure een message handle procedure wordt meegegeven. De WndProc van het type WNDPROC. Dit is nu een procedure van de klasse geworden welke het window beheert. Met voor de rest alleen default waarde krijg je

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style      = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)this->WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon      = LoadIcon(hInstance, (LPCTSTR)IDI_VEC);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = (LPCTSTR)IDC_VEC;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

    m_ClassID = RegisterClassEx(&wcex);


Nu krijg ik echter een heel vage foutmelding:

c:\projects\vec\vec\MainWindow.cpp(88): error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'WNDPROC'

Iemand suggesties? Of toelichting op wat in de help staat, want daar snap ik niet echt veel van.

Alvast Bedankt!

All your quantifications are belong to me!


Verwijderd

hoe is je WndProc gedefinieerd ?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Static.

Professionele website nodig?


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Verwijderd schreef op 23 december 2002 @ 14:08:
hoe is je WndProc gedefinieerd ?
LRESULT CALLBACK CAppWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

Nogal standaard dus. Alleen dat deze dus binnen een klasse is gedefinieerd.

All your quantifications are belong to me!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Ja, dat werkt dus niet. this->WndProc is geen functieadres. Het probleem is de "this"-pointer. Windows zelf is C-georienteerd en levert geen (kant en klare) this-pointer. CAppWindow::WndProc heeft die wel nodig.

De oplossing is zoals curry684 zegt een static method te gebruiken. Static methods horen bij een class, niet bij een object. Vervolgens kan die static method bepalen welk object er bedoeld werd, (cq. this-pointer ophalen) en een private non-static method daarop aanroepen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

MSalters schreef op 23 december 2002 @ 14:16:
Ja, dat werkt dus niet. this->WndProc is geen functieadres. Het probleem is de "this"-pointer. Windows zelf is C-georienteerd en levert geen (kant en klare) this-pointer. CAppWindow::WndProc heeft die wel nodig.

De oplossing is zoals curry684 zegt een static method te gebruiken. Static methods horen bij een class, niet bij een object. Vervolgens kan die static method bepalen welk object er bedoeld werd, (cq. this-pointer ophalen) en een private non-static method daarop aanroepen.
Ik was iets 'summierder' :Y)

Maar idd punt is die this pointer. Een correcte pointer naar een class method (Borland noemt ze __closure bijvoorbeeld) telt op een 32-bit systeem 8 bytes: 4 bytes voor de methodpointer en 4 bytes voor de class-instance-pointer. Tis namelijk onmogelijk om een class method uit te voeren buiten de context van een instance, tenzij de method static is, dan krijg je namelijk spannende errors als je de membervariabelen probeert aan te spreken ('static method cannot reference this pointer' en dat soort spannends).

Om het maar meteen helemaal voor te zeggen wil je extra ruimte reserveren binnen je windowclasses, en in je WndProc kun je dan iets als volgt doen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Static call-through method
LRESULT CALLBACK CMyClass::StaticWndProc(HWND hWnd, UINT message, 
                                           WPARAM wParam, LPARAM lParam)
{
CMyClass* l_Class = (CMyClass*)GetWindowLongPtr(hWnd, ...);

return l_Class->WndProc(hWnd, message, wParam, lParam);
}

// Private non-static method
LRESULT CMyClass::WndProc(HWND hWnd, UINT message, 
                           WPARAM wParam, LPARAM lParam)
{
...
}

[ Voor 4% gewijzigd door curry684 op 23-12-2002 14:26 . Reden: Readability ]

Professionele website nodig?

Pagina: 1