Mam trudności z wywołaniem wskaźnika do funkcji składowej na obiekcie, który został przesłany z poziomu void*
. Zobacz poniżej przykład:Nie można wywołać wskaźnika do funkcji elementu z metody statycznej
class Test
{
public:
Test(int pointTo)
{
if (pointTo == 1)
function = &Test::Function1;
else
function = &Test::Function2;
}
static void CallIt(void* cStyle)
{
Test* t(static_cast<Test*>(cStyle));
(t->*function)();// error C2568: '->*': unable to resolve function overload
}
void CallIt()
{
(this->*function)();// Works just fine
}
private:
typedef void (Test::*ptrToMemberFunc)();
ptrToMemberFunc function;
void Function1()
{
std::cout << "Function 1" << std::endl;
}
void Function2()
{
std::cout << "Function 2" << std::endl;
}
};
int main()
{
Test t1(1);
Test t2(2);
Test::CallIt(static_cast<void*>(&t1));
Test::CallIt(static_cast<void*>(&t2));
t1.CallIt();
t2.CallIt();
return 0;
}
Co się dzieje, gdy obiekt zostanie oddane do void*
iz powrotem? Dlaczego nie mogę już wywoływać wskaźnika do funkcji składowej?
EDIT:
Modyfikowanie CallIt()
następująco umożliwia program do kompilacji, ale wciąż jestem ciekaw, dlaczego oryginalny nie działa.
static void CallIt(void* cStyle)
{
Test* t(static_cast<Test*>(cStyle));
Test::ptrToMemberFunc pf(t->function);
(t->*pf)();
}
, że to śmieszne, że ja po prostu napisał dokładnie ten sam kod w wandbox, aż do identificatiors. Odpowiedź Tuple_cat wyjaśnia to. Zasadniczo musisz połączyć obiekt i wywołać, więc jeden operator nie jest wystarczający. Niektóre kompilatory udostępniają bardziej zrozumiałe komunikaty o błędach, na przykład informują, że można wywołać w ten sposób tylko statyczny element - wskazówka, że nie miałeś dla nich wskaźnika. – Swift
Odnośnie twojej edycji, po prostu myślę o wyglądzie operatora '- > * cię wyrzuca. Rozważmy, że była to zwykła funkcja o nazwie 'call_with_this', która przyjęła wskaźnik do obiektu i funkcji składowej. Wtedy twoje pierwotne niedziałające połączenie było 'call_with_this (t, function);'. Tutaj tak się składa, że nazwa 'function' jest niestatycznym elementem klasy' Test', ale nie ma nic wspólnego z 't'. A ponieważ masz funkcję statyczną, nie ma "tego", aby rozszyfrować nazwę funkcji. Gdy zapytasz o funkcję 't- >', masz aktualną wartość z dostępną nazwą. – GManNickG
@GManNickG Dokładnie to. Teraz, gdy widzę rozwiązanie, rozumiem, ale nie zdawałem sobie sprawy, co właściwie robi operator '-> *' (czytałem go jako '(t -> (* funkcja))'). – Kerry