PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger auf Methoden?



7.e.Q
26-10-2005, 14:47
Hallo Leute,

C++ bietet ja die schöne Möglichkeit, Funktionszeiger zu definieren. Ich möchte nun aber, daß dieser Zeiger auf die Memberfunktion (Methode) eines Objektes zeigt. Also im Prinzip so (pseudocode):




typedef void (*methodenzeiger)(void);

CObjekt t_MyObjekt;
methodenzeiger pZeiger = t_MyObjekt.MyFunction;



So... daß das so nicht geht, hab ich schon herausgefunden. Aber wie und überhaupt geht das nun?

Danke

Gruß,
Hendrik

locus vivendi
26-10-2005, 15:15
Die Syntax zum Erzeugen eines Zeigers auf eine Memberfunktion (pointer-to-member-function) lautet "&Klasse::Memberfunktion". Ansonsten ist das eine FAQ:
http://www.parashift.com/c++-faq-lite/pointers-to-members.html
(Die Syntax kann man dem Dokument auch entnehmen, allerdings wird sie nicht extra erwähnt.)
Mehr zum Thema auch hier:
http://www.icce.rug.nl/documents/cpp.shtml

Joghurt
26-10-2005, 18:01
Ich denke, dass was du willst, nämlich einen Pointer auf eine "Instanz einer Methode" zu bekommen, nicht geht.

Beispiel:
Class Foo {...};
Foo a,b;
f = &a.bar;
g = &b.bar;Das geht natürlich nicht, da "a.bar(x,y,z)" nur eine Kurzschreibweise für "Foo::bar(&a,x,y,z)" ist, der erste Parameter Foo* this wird ja immer mitgegeben.

Wenn du diese Funktionalität wirklich brauchst, musst du einen Wrapper schreiben, wenn du nur einen allgemeinen Pointer auf die Methode haben willst, geht es natürlich wie von locus vivendi beschrieben.

7.e.Q
26-10-2005, 18:50
Also ist es per Definition technisch nicht möglich, einen Funktions-Zeiger zu erstellen, der auf die Funktion einer Klassen-Instanz (Aufruf objekt.methode() )zeigt? Es somit nur möglich, Zeiger auf statische Funktionen einer Klasse zeigen zu lassen (aufruf klasse::methode() )?

RapidMax
26-10-2005, 19:29
Gut zu merken und immer wieder hilfreich: http://www.function-pointer.org/

Gruss, Andy

locus vivendi
26-10-2005, 19:41
Also ist es per Definition technisch nicht möglich, einen Funktions-Zeiger zu erstellen, der auf die Funktion einer Klassen-Instanz (Aufruf objekt.methode() )zeigt?
Das scheitert daran, dass es keine eigene Funktion für ein Objekt (Instanz einer Klasse) gibt.


Es somit nur möglich, Zeiger auf statische Funktionen einer Klasse zeigen zu lassen (aufruf klasse::methode() )?
Nein, wie die Links die ich bereits gegeben haben erklären, man kann sehrwohl Zeiger auf nicht-statische Member(-Funktionen) erhalten. Nur braucht man natürlich zum Aufrufen dieser auch ein Objekt.

anda_skoa
27-10-2005, 11:47
Jetzt mal aus Interesse: wozu bräuchte man einen Funktionspointer mit impliziten Kontext?

Bei C callbacks gibt es praktisch immer ein Kontextargument und in C++ hab ich ohnehin Interfaces.

Ciao,
_

7.e.Q
27-10-2005, 21:27
Wenn man alternative Konzepte noch nicht 100% verstanden hat. Ich hab ein Programm, das Timer verwendet, aus denen Callback Funktionen aufgerufen werden. Und ich hätte gerne einem Timer auch Zeiger auf Memberfunktion eines Objektes übergeben, statt nur normale Funktionszeiger. Aber wenn's nicht geht... eventuell kannst du mir ja erklären, was Interfaces sind. Das ist bei mir noch ein Bildungskrater.

anda_skoa
28-10-2005, 13:51
Das ist mehr oder weniger eine Basisklasse mit rein viruellen Methoden



class TimeoutInterface
{
public:
virtual void timeout() = 0;
};


Eine Klasse könnte das so implementieren


class MyClass : public MyBase, public TimeoutInterface
{
public:
virtual void timeout() { cout << "MyBase::timeout()" << endl; }
}


Eine andere Klasse könnte das so verwenden


class Timeout
{
public:
void addTimeoutHandler(TimeoutInterface* handler)
{
if (handler == 0) return;
m_handlers.push_back(handler);
}

void timeout()
{
list<TimeoutInterface*>::iterator it = m_handler.begin();
for (; it != m_handler.end(); ++it) (*it)->timeout();
}

private:
list<TimeoutInterface*> m_handlers;
};


Ciao,
_