Statyczny wskaźnik do metody w tej samej klasie

0

Cześć,
chciałem się zapytać, czy w C++ jest możliwość utworzenia statycznego wskaźnika do niestatycznej metody?
Chodzi mi o to, że po przypisaniu danej metody do takiego wskaźnika każdy obiekt będzie wywoływał właśnie tą przypisaną metodę. Gdy zmieni się metodę (przypisze do wskaźnika inną metodę) to każdy obiekt również będzie wywoływał inną metodę przy pomocy tego samego wskaźnika.
Z góry dziękuję za pomoc w rozjaśnieniu problemu.

1

Czemu nie:

#include <iostream>
using namespace std;

struct Foo
  {
   typedef void (Foo::*FooFun)();
   static FooFun ptr;
   void funA() { cout<<'A'<<endl; }
   void funB() { cout<<'B'<<endl; }
   void fun() { (this->*ptr)(); }
  };
Foo::FooFun Foo::ptr=&Foo::funA;

int main()
  {
   Foo f;
   f.fun();
   (f.*Foo::ptr)();
   Foo::ptr=&Foo::funB;
   f.fun();
   (f.*Foo::ptr)();
   return 0;
  }
#include <iostream>
using namespace std;

struct Foo
  {
   static void (Foo::*ptr)();
   void funA() { cout<<'A'<<endl; }
   void funB() { cout<<'B'<<endl; }
   void fun() { (this->*ptr)(); }
  };
void (Foo::*Foo::ptr)()=&Foo::funA;

int main()
  {
   Foo f;
   f.fun();
   (f.*Foo::ptr)();
   Foo::ptr=&Foo::funB;
   f.fun();
   (f.*Foo::ptr)();   
   return 0;
  }
0

Dziękuję bardzo za pomoc!
Właśnie tak miałem już pisać, że na pewno się da, ale nie mogłem skombinować jak to zorganizować w całości :P.
Muszę to na spokojnie przeanalizować ;-)
pozdrawiam.

0

@_13th_Dragon właśnie zauważyłem Twój komentarz i powiem szczerze, że bardzo mnie zaskoczył, bo również mam problem ze zrobieniem wersji bez typedef-a i właśnie chciałem również o to zapytać ;-)
Z typedef-ów nigdy nie korzystałem i mam jeszcze trochę wątpliwości jak to działa... Stąd moje kolejne pytanie:
Typedef tworzy alias dla jakiegoś typu danych, czyli zapis:

typedef void (Foo::*FooFun)();
static FooFun ptr;

jest analogiczny do zapisu:

static void (Foo::*ptr)(); //tak?

Wówczas zapis:

Foo::FooFun Foo::ptr=&Foo::funA;

chyba można zamienić na taki kawałek kodu:

void (Foo::*ptr)() = &Foo::FunA; //kompiluje się ;) ale pewności nie mam

Całość u mnie wygląda tak:

struct Foo
	{
	//typedef void (Foo::*FooFun)();
	//static FooFun ptr;
	static void (Foo::*ptr)();
	void funA() { cout<<'A'<<endl; }
	void funB() { cout<<'B'<<endl; }
	void fun() { (this->*ptr)(); }
	};
//Foo::FooFun Foo::ptr=&Foo::funA;
void (Foo::*ptr)() = &Foo::funA;

Jak utworzę obiekt f, tak jak Ty to zrobiłeś, to jest wszystko ok - kompilator nie protestuje.
Niestety jak spróbuję wywołać funkcję analogicznie do Twojej wersji tj. f.fun(); to wywala mi następujący błąd:

error LNK2001: unresolved external symbol "public: static void (__thiscall Foo::* Foo::ptr)(void)" (?ptr@Foo@@2P81@AEXXZQ1@)

I teraz pytanie: czemu tak się dzieje? Gdzie jest popełniony błąd? :( Z czym to jest związane?

Drugie pytanie dot. wywołania tak stworzonego wskaźnika - czy można wywołać ten wskaźnik do funkcji bez korzystania z pomocniczej metody (fun())?
Chodzi mi o to, czy można wywołać przypisaną metodę bezpośrednio "z obiektu" tzn. zrobić coś na wzór poniższego zapisu:

Foo f;
f.(Foo::*ptr)(); //przy takim rozwiązaniu wywala błąd - ale może jest inna opcja (próbowałem już wiele :( ).

Jeszcze raz bardzo dziękuję za już okazaną i przyszłą pomoc!
pozdrawiam

0

SUPER! Dziękuję!!! ;-)

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