Problem z klasą iwinapi - errC3867|wymusza statyczne zmienne

0

Przepraszam za tak mylącą nazwę tematu, ale trochę za mało miejsca na napisanie dokładniej.

http://wklej.org/id/86744/
Tu jest deklaracja klasy

http://wklej.org/id/86746/
A tu jej definicje

Trochę powycinałem, bo było za dużo niepotrzebnego śmiecia które by zaśmieciło tylko widok.
I problem jest tam gdzie jest komentarz z napisem problem. Błąd kompilatora -

'WindowStructure::WndProc': function call missing argument list; use '&WindowStructure::WndProc' to create a pointer to member
Numer błędu - error C3867

Jak postąpię tak jak to jest napisane, czyli dam &WindowStructure::WndProc, to wtedy -

'DialogBoxParamA' : cannot convert parameter 4 from 'INT_PTR (__stdcall WindowStructure::* )(HWND,UINT,WPARAM,LPARAM)' to 'DLGPROC'
        There is no context in which this conversion is possible

Numer błędu - error C2664

Mogę to zlikwidować biorąc tak że dam w .hpp te 2 funkcje jako statyczne. Ale wtedy Visual WYMUSZA na mnie to żęby wszystko było zdefiniowane jako statyczne, co doprowadza do jeszcze większej ilości problemów. Co prawda to nie są jakieś problemy z którymi bym sobie nie poradził, ale trochę to negatywnie dla mnie wpływa na czytelność mojego tekstu.

Jak temu zaradzić?

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1