2010-03-03 18 views
5

Ich hatte dieses Problem vor einiger Zeit und ich gab auf, aber in letzter Zeit kehrte es zurück.So rufen Sie einen Zeiger auf Methode von einer anderen Methode

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

Ich erhalte Fehler bei markierte Zeile:

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

würde ich wirklich für Hilfe dankbar. Es gab heute ähnliche Fragen, die mir teilweise geholfen haben: link. Aber es scheint nicht die vollständige Antwort auf mein Problem zu sein.

Eigentlich haben diese beiden Probleme nur einen Unterschied - Punkt, an dem die Funktion aufgerufen wird.

Vielen Dank für Ihre Zeit

Antwort

5

"Dies" ist ein Zeiger auf Node2D aber FunctionPtr bezieht sich auf ein Mitglied von Element2D - das ist der Fehler.

#if 0 // gebrochene Version

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

#else // feste Version

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

#endif

Dann rufen Sie es mit so etwas wie:

myElement.myNode.otherMethod(&myElement); 

Es gibt Dinge, die du kannst Ich würde tun, um dies zu verbessern, aber das sollte Sie beginnen.

0

Sie benötigen einen Zeiger auf element2D Objekt, wenn Sie einen Zeiger auf element2D Mitglied anrufen möchten. Erwägen Sie, Boost.Function oder Boost.Signals2 für die gewünschte Funktionalität zu verwenden.

Verwandte Themen