2010-03-03 21 views
5

Ho avuto questo problema qualche tempo fa e mi sono arreso ma ultimamente è tornato.Come chiamare un puntatore al metodo da un altro metodo

#include <iostream> 

class element2D; 

class node2D 
{ 
public: 
    void (element2D::*FunctionPtr)(); 
    void otherMethod() 
    { std::cout << "hello" << std::endl; 
     ((this)->*(this->FunctionPtr))(); //ERROR<------------------- 
    } 

}; 

class element2D 
{ 
public: 
    node2D myNode; 
    void doSomething(){ std::cout << "do something" << std::endl; } 
}; 

int main() 
{ 
    element2D myElement; 

    myElement.myNode.FunctionPtr = &element2D::doSomething; //OK 
    ((myElement).*(myElement.myNode.FunctionPtr))();  //OK 

    return 0; 
} 

sto ottenendo errore alla linea marcata:

pointer to member type 'void (element2D::)()' incompatible with object type 'node2D' 

Sarei davvero grato per l'aiuto. C'era una domanda simile oggi che mi ha parzialmente aiutato: link. Ma non sembra essere la risposta completa al mio problema.

In realtà questi due problemi hanno una sola differenza: il punto in cui viene chiamata la funzione.

Grazie per il vostro tempo

risposta

5

"questo" è un puntatore a node2D ma FunctionPtr fa riferimento a un membro di element2D - questo è l'errore.

#if 0 // versione rotto

void otherMethod() 
{ std::cout << "hello" << std::endl; 
    ((this)->*(this->FunctionPtr))(); //ERROR<------------------- 
} 

#else // versione fissa

void otherMethod(element2D * that) 
{ std::cout << "hello" << std::endl; 
    ((that)->*(this->FunctionPtr))(); 
} 

#endif

Poi si chiami con qualcosa di simile:

myElement.myNode.otherMethod(&myElement); 

Ci sono cose che Devo migliorare su questo, ma questo dovrebbe iniziare.

0

Avete bisogno di un puntatore a oggetto element2D se si desidera chiamare un puntatore a membro element2D. Prendi in considerazione l'utilizzo di Boost.Function o Boost.Signals2 per la funzionalità che desideri.

Problemi correlati