C++: Zeiger auf Elementfunktionen

Post Reply
Message
Author
mvo

C++: Zeiger auf Elementfunktionen

#1 Post by mvo »

Hallo,
ich moechte in einem Programm Elementfunktionen einer Klasse ueber Zeiger aufrufen. In C sind Zeiger auf Funktionen ja kein Problem, aber hier komme ich nicht weiter. Ich habe mal ein kleines Testprogramm geschrieben, um das Problem isoliert zu behandeln:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <iostream.h>

class TestClass {

public:
TestClass() {};
~TestClass() {};

void func1(void) { cout << "Funktion 1!" << endl; };
void func2(void) { cout << "Funktion 2!" << endl; };
};

main () {
TestClass *A;
void (TestClass::*fptr1)(void);
void (TestClass::*fptr2)(void);

A = new TestClass();
fptr1 = &(A->func1);
fptr2 = &(A->func2);

fptr1();
fptr2();

return 0;
}
</font><hr></pre></blockquote>

Das gibt schon einen Haufen Compilierfehler, aber was besseres faellt mir nicht mehr ein:

mvo@hal9000:~/develop$ g++ -o fpoint fpoint.cpp
fpoint.cpp: In function `int main()':
fpoint.cpp:19: taking the address of a bound member function
fpoint.cpp:19: to form a pointer to member function, say `&TestClass::func1'
fpoint.cpp:20: taking the address of a bound member function
fpoint.cpp:20: to form a pointer to member function, say `&TestClass::func2'
fpoint.cpp:22: pointer to member function called, but not in class scope
fpoint.cpp:23: pointer to member function called, but not in class scope

trinity
Posts: 821
Joined: 12. Oct 2001 10:04

Re: C++: Zeiger auf Elementfunktionen

#2 Post by trinity »

Also wenn cih deinen Compieler Richtig verstanden habe, will er das du Zeile 19+20 folgendermassen umschreibst:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
fptr1 = &(A->TestClass::func1);
fptr2 = &(A->TestClass::func2);
</font><hr></pre></blockquote>
"Korrekt, Freundlich, Kostenfrei", wähle genau zwei. (Lutz Donnerhacke in dcsf)

mvo

Re: C++: Zeiger auf Elementfunktionen

#3 Post by mvo »

Eine der vielen Kombinationen, die ich schon durchgespielt habe :( :

fpoint.cpp: In function `int main()':
fpoint.cpp:18: no match for `TestClass & = TestClass *'
fpoint.cpp:11: candidates are: class TestClass & TestClass::operator =(const TestClass &)
fpoint.cpp:19: base operand of `->' has non-pointer type `TestClass'
fpoint.cpp:20: base operand of `->' has non-pointer type `TestClass'
fpoint.cpp:22: pointer to member function called, but not in class scope
fpoint.cpp:23: pointer to member function called, but not in class scope

Was mich stutzig macht, sind die beiden letzten Meldungen. Geht das so ueberhaupt oder kann ich nur innerhalb einer Klasseninstanz mit Zeigern arbeiten?

mvo

Re: C++: Zeiger auf Elementfunktionen

#4 Post by mvo »

So, ich hab's inzwischen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <iostream.h>

class TestClass {

public:
TestClass() {};
~TestClass() {};

void func1(void) { cout << "Funktion 1!" << endl; };
void func2(void) { cout << "Funktion 2!" << endl; };
};

main () {
TestClass *A;
typedef void (TestClass::*MemFuncPtr)(void);

MemFuncPtr fptr1 = &TestClass::func1;
MemFuncPtr fptr2 = &TestClass::func2;

A = new TestClass();

(A->*fptr1)();
(A->*fptr2)();

return 0;
}
</font><hr></pre></blockquote>
Der Nachteil ist, dass ich den Pointer auf die Klasseninstanz _und_ den Pointer auf die Elementfunktion benoetige. Vielleicht bastele ich mir noch eine eigene Hilfsklasse, um das einfacher zu handhaben.
Wo ich das gefunden habe: <a href="http://msdn.microsoft.com/archive/en-us ... frame=true" target="_blank"><!--auto-->http://msdn.microsoft.com/archive/en-us ... <!--auto-->
Auch bei Microsoft koennen manche programmieren, obwohl das hier nicht alle wahrhaben wollen <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">.

Post Reply