wyrazasz sie miejscami dziwacznie, wiec przypominajka z podstaw obiektowosci w C++:
-
metody obiektow NIE MOGA PRACOWAC BEZ OBIEKTOW. jesli podajesz komus metode nie-static &blah::WndProc, to metoda ta spodziewa sie ze bedie odpalona na OBIEKCIE. sadzac z nazwy, cos co chce dostac ten wskaznik, spodziewa sie wndproc'a, czyli FUNKCJI i odpali ja jak funkcje. efekt? metoda nie dostalaby obiektu na ktorym mogla by pracowac, jebut. nullpointer. crash. etc. oznaczenie metody jako static, tworzy z niej defacto funkcje oderwana od obiektu i jedynie dla porzadku wcisnieta w 'namespace' "klasa". dlatego mozna ja wywolac bez obiektu, dlatego mozna ja podac jako wndproc.
-
static'i dzialaja bez obiektow, wiec widza w klasie tylko static'i. innych rzeczy nie ma i kropka. inne rzeczy nie sa globalne, naleza do konkretnych wystapien obiektow. funckja/metoda static nie moze sie do nich dostac bo NIE MA OBIEKTU. nie visual a czysta logika to wymusza.
a gdzie teraz jestes?
a) to co podajesz jako wndproc musi byc FUNKCJA albo STATIC-METHOD
b) czynnosci ktore chcesz wykonac w tym czyms potrzebuja dostepu do non-static, wiec to cos MUSI miec DOSTEP DO OBIEKTU
i z tego miejsca, ani jednego, ani drugiego nie przeskoczysz.
musisz to rozwiazac w najlogiczniejszy mozliwy sposob: musisz owej statycznej metodzie JAKOS PODAC OBIEKT i ona musi go uzyc by sie dostac do jego wnetrza
popatrz dokladnie jakie parametry przyjmuje ow wndproc. moze ktorys jest void*param ? to czemu podawac tam null, podaj tam &obiekt i wewnatrz metody zrzutuj i korzystaj z tego obiektu:
class Klasa{
/*nonstatic*/ int pole;
static void proc(void*param){
((Klasa*)param) -> pole = 10;
}
};
ble()
{ Klasa obiekt;
run(&Klasa::proc, &obiekt);
/*uwaga: obiekt w tym miejscu wyparowuje. RUN oraz PROC musza na to uwazac*/
}
albo ladniej:
class Klasa{
/*nonstatic*/ int pole;
static void proc(void*param){
((Klasa*)param) -> proc_normal(); // trick!
}
/*nonstatic*/ void proc_normal(){
pole = 10;
}
};
ble()
{ Klasa obiekt;
run(&Klasa::proc, &obiekt);
/*uwaga: obiekt w tym miejscu wyparowuje. RUN oraz PROC musza na to uwazac*/
}
mniejwiecej w ten 'ladniejszy' sposob pracuje klasyczne "odpalanie watku wykonujacego metode obiektu" wykonywane poprzez boost::thread, polecam zerknac bo problem z threadproc jest ten sam
jesli zas void*param nie ma, to gorzej -- musisz dostarczyc opakowanie ktore ow param zapamieta i dopiero potem odpalic te metode.. patrz np. boost::bind