2010-03-03 24 views
5

Tuve este problema hace algún tiempo y me rendí, pero últimamente regresó.Cómo llamar un puntero al método desde otro método

#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; 
} 

Estoy consiguiendo error en la línea marcada:

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

Estaría muy agradecido por la ayuda. Hubo una pregunta similar hoy que me ayudó parcialmente: link. Pero no parece ser la respuesta completa a mi problema.

En realidad, estos dos problemas tienen una sola diferencia: punto donde se llama a la función.

Gracias por su tiempo

Respuesta

5

"this" es un puntero a node2D pero FunctionPtr se refiere a un miembro de element2D - ese es el error.

#if 0 // versión rota

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

#else // versión fija

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

#endif

Posteriormente, se llama con algo como:

myElement.myNode.otherMethod(&myElement); 

Hay cosas que puedes Haría para mejorar esto, pero esto debería ayudarte a empezar.

0

Se necesita un puntero al objeto element2D si desea llamar a un puntero a miembro de element2D. Considere usar Boost.Function o Boost.Signals2 para la funcionalidad que desee.

Cuestiones relacionadas