jak uzyskać Wskaźnik na metodę klasy?

0

Witajcie !
W jaki sposób można uzyskać wskaźnik na metodę klasy? Co robie w tym kodzie źle?

typedef void( * SETVALUE )( int );

class Klasa{
    public:
        void SetValue(int newValue);
        void SetWsk(HWND hwnd);
    private:
        int Value;
};
Klasa::SetValue(int newValue){
    Value = newValue;
}
Klasa::SetWsk(HWND hwnd){
    SetWindowLong(hwnd, 0, (LONG)(SETVALUE)SetValue);
} 

Tak dla przykładu to napisałem, chce za pomocą funkcji SetWsk() przypisać dla okienka wskaźnik na funkcję.

2

Może wyjaśnię na przykładzie. Problem w tym że SETVALUE nie można przekształcić do innego typu, ale CALLSETVALUE już tak:

#include <iostream>
#include <windows.h>
using namespace std;

class Klasa
  {
   public:
      int GetValue()const { return Value; }
      void SetValue(int newValue);
      static void CallSetValue(Klasa &k,int newValue) { return k.SetValue(newValue); }
   private:
      int Value;
  };
  
typedef void CALLSETVALUE(Klasa &k,int newValue); 
typedef void (Klasa::*SETVALUE)(int);
 
void Klasa::SetValue(int newValue)
  {
   Value=newValue;
  }
  
int main()
  {
   Klasa k,*ptr=&k;
   SETVALUE fun=&Klasa::SetValue;
   k.SetValue(13);
   cout<<k.GetValue()<<endl;
   (k.*fun)(666);
   cout<<k.GetValue()<<endl;
   (ptr->*fun)(13);
   cout<<k.GetValue()<<endl;
   LONG tmp=(LONG)&Klasa::CallSetValue;
   CALLSETVALUE *pmt=(CALLSETVALUE*)tmp;
   pmt(k,666);
   cout<<k.GetValue()<<endl;   
   return 0;
  }
1
SetWindowLong(hwnd, 0, (LONG)(SETVALUE)SetValue);

A cóż to za magiczna wartość 0?

Do zapisania wskaźnika służy SetWindowLongPtr:

SetWindowLongPtr(..., (LONG_PTR)cośtam);
0

Jeszcze jedno, czytam właśnie o pewnej alternatywie. Nie lepiej mi wysłać za pomocą funkcji SetWindowLongPtr() wskaźnika na klasę i z niego wywołać funkcję? Oszczędzę linijki kodu. Sprawdzam jak działa "this" i chyba jest o.k.

#include <iostream>
using namespace std;

class Klasa{
   public:
      Klasa *GetPtr();
      int wartosc;
};
Klasa * Klasa::GetPtr(){
    return this;
}

int main()
  {
   Klasa k1, k2;
   Klasa *wsk = k2.GetPtr();
   k1.wartosc = 1;
   k2.wartosc = 2;
   cout<<"1 = "<<k1.wartosc<<endl<<"2 = "<<k2.wartosc<<endl;
   cout<<"Ptr = "<<wsk->wartosc;

   return 0;
  }

 
0
#include <iostream>
using namespace std;
 
class Klasa{
   public:
      Klasa *GetPtr();
      int wartosc;
};
Klasa * Klasa::GetPtr(){
    return this;
}
 
int main()
  {
   Klasa k1, k2;
   Klasa *wsk = k2.GetPtr();
   if(wsk == &k2) cout<<"Po kiego mi ten cholerny GetPtr()?!"<<endl;
   if(k1.GetPtr() == &k1) cout<<"Czy rozumiesz co tu się dzieje?!"<<endl;
   k1.wartosc = 1;
   k2.wartosc = 2;
   cout<<"1 = "<<k1.wartosc<<endl<<"2 = "<<k2.wartosc<<endl;
   cout<<"Ptr = "<<wsk->wartosc;
 
   return 0;
  }
0

@_13th_Dragon No tak, rozumiem ten kod w pełni. Pamiętasz z moich poprzednich postów jak tworzyłem kontrolkę? Trzeba było w niej podać wskaźnik na wskaźnik do kontrolki. Przez to tworzenie kontrolki stało się strasznie ograniczone. Teraz pozbyłem się tego z pomocą this :)

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