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
C++: Zeiger auf Elementfunktionen
Re: C++: Zeiger auf Elementfunktionen
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>
<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)
Re: C++: Zeiger auf Elementfunktionen
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?
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?
Re: C++: Zeiger auf Elementfunktionen
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">.
<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">.