2017-02-22 17 views
8

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)(); 
} 
+0

, ż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

+0

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

+0

@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

Odpowiedz

10
main.cpp:17:14: error: invalid use of member 'function' in static member function 
     (t->*function)();// error C2568: '->*': unable to resolve function overload 
      ^~~~~~~~ 

function jest non-static członek danych, więc nie można uzyskać do niego dostęp z funkcją statycznego.

Jeśli chcesz zapoznać się t „s function, można to zrobić tak:

 (t->*(t->function))(); 
+0

To jest ten sam powód, dla którego jest on zmuszony napisać '(this -> * function)()' w niestatycznym elemencie, najgłębszy operator indeksu "dostaje" wartość wskaźnika, podczas gdy skrajnie pozwala na wywołanie w odniesieniu do obiektu – Swift

Powiązane problemy