Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Man kann keine Zeiger auf nichtstatische Memberfunktionen übergeben. Ich persönlich nutze dafür dann statische Methoden (falls es immernoch um eine Singletonklasse geht), die nur dazu da ist die Methode aufzurufen. Ansonsten müsstest du wohl das Objekt übergeben und damit die Methode aufrufen.Zitat von »"PCShadow"«
Jetzi st noch ein anderer Fehler (bzw. Problem meinerseits) aufgetaucht: wie erhalte ich einen Zeiger auf eine nicht-statische Memberfunktion einer Klasse?
meine Bisherigen Versuche:
C-/C++-Quelltext
1 2 3 Win::Instance()->WindowProc //ich weiß allerdings nicht mehr, was der Fehler war, nur das der VC vorschlug, ich sollte '&' verwenden, um einen Zeiger zu erhalten &Win::Instance()->WindowProc //VC: "konvertierung von LRESULT (__stdcall) (Win*)(HWND,UINT,LPARAM,WPARAM) nach WNDPROC nicht möglich" &(Win::Instance()->WindowProc) //VC: "1>c:\c++\blocker\blocker.cpp(7) : error C2276: '&': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion"
Zitat von »"PCShadow"«
Zitat von »"David_pb"«
C-/C++-Quelltext
1 &Win::WindowProc
nützt mir aber nichts wenn die funktion nicht statisch ist, und wenn ich se statisch mache, kann ich nicht mehr auf die Membervariablen zugreifen - oder geht das, wenn ich die benötigten Membervariablen auch statisch mache :?
einen Versuch ist es Wert!
Tut es bei mir persönlich nicht. Dann kommen Fehlermeldungen wieZitat von »"David_pb"«
Zitat von »"PCShadow"«
Zitat von »"David_pb"«
C-/C++-Quelltext
1 &Win::WindowProc
nützt mir aber nichts wenn die funktion nicht statisch ist, und wenn ich se statisch mache, kann ich nicht mehr auf die Membervariablen zugreifen - oder geht das, wenn ich die benötigten Membervariablen auch statisch mache :?
einen Versuch ist es Wert!
Doch, genau so geht das mit nicht statischen Memberfunktionen...
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
const uf::Result uf::Logfile::var(const std::vector<std::string> Name, const std::vector<std::string> Value) { std::vector<std::string>::iterator i, j; i=Name.begin(); j=Value.begin(); //... } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
c:\c++\useful\logfile.cpp(66) : error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::_Vector_const_iterator<_Ty,_Alloc>' akzeptiert (oder keine geeignete Konvertierung möglich) 1> with 1> [ 1> _Ty=std::string, 1> _Alloc=std::allocator<std::string> 1> ] 1> c:\program files\microsoft visual studio 9.0\vc\include\vector(405): kann 'std::_Vector_iterator<_Ty,_Alloc> &std::_Vector_iterator<_Ty,_Alloc>::operator =(const std::_Vector_iterator<_Ty,_Alloc> &)' sein 1> with 1> [ 1> _Ty=std::string, 1> _Alloc=std::allocator<std::string> 1> ] 1> bei Anpassung der Argumentliste '(std::_Vector_iterator<_Ty,_Alloc>, std::_Vector_const_iterator<_Ty,_Alloc>)' 1> with 1> [ 1> _Ty=std::string, 1> _Alloc=std::allocator<std::string> 1> ] |
Zitat von »"Genion"«
Tut es bei mir persönlich nicht. Dann kommen Fehlermeldungen wieZitat von »"David_pb"«
Zitat von »"PCShadow"«
Zitat von »"David_pb"«
C-/C++-Quelltext
1 &Win::WindowProc
nützt mir aber nichts wenn die funktion nicht statisch ist, und wenn ich se statisch mache, kann ich nicht mehr auf die Membervariablen zugreifen - oder geht das, wenn ich die benötigten Membervariablen auch statisch mache :?
einen Versuch ist es Wert!
Doch, genau so geht das mit nicht statischen Memberfunktionen...
Konvertierung des Parameters 1 von 'int (__thiscall Framework::* )(float)' in 'int (__cdecl *)(float)' nicht möglich
Die Zeiger auf Memberfunktionen zeigen nämlich nicht auf die Funktion selbst sondern nur ein Offset um den die Funktion im Vergleich zum Objekt verschoben ist und müssten immernoch mit Objektpointer-> Funktion angesprochen werden. Bzw. im Falle des Funktionszeigers mit Objektpointer->*Funktionspointer
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
struct foo { int bar( float f ) { printf( "%f\n", f ); return 0; }; }; // ... int ( foo::*fun )( float ) = &foo::bar; foo x; (x.*fun)( 3.1415f ); |
C-/C++-Quelltext |
|
1 |
std::vector<std::string>::const_iterator i, j; |
Sag ich doch , dass der Zeiger nur ein Offset speichert und man es nur über Objektpointer->*Funktionspointer aufrufen kann. Ohne das Objekt zu kennen funktioniert es nicht.Zitat von »"David_pb"«
Zitat von »"Genion"«
Tut es bei mir persönlich nicht. Dann kommen Fehlermeldungen wieZitat von »"David_pb"«
Zitat von »"PCShadow"«
Zitat von »"David_pb"«
C-/C++-Quelltext
1 &Win::WindowProc
nützt mir aber nichts wenn die funktion nicht statisch ist, und wenn ich se statisch mache, kann ich nicht mehr auf die Membervariablen zugreifen - oder geht das, wenn ich die benötigten Membervariablen auch statisch mache :?
einen Versuch ist es Wert!
Doch, genau so geht das mit nicht statischen Memberfunktionen...
Konvertierung des Parameters 1 von 'int (__thiscall Framework::* )(float)' in 'int (__cdecl *)(float)' nicht möglich
Die Zeiger auf Memberfunktionen zeigen nämlich nicht auf die Funktion selbst sondern nur ein Offset um den die Funktion im Vergleich zum Objekt verschoben ist und müssten immernoch mit Objektpointer-> Funktion angesprochen werden. Bzw. im Falle des Funktionszeigers mit Objektpointer->*Funktionspointer
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 struct foo { int bar( float f ) { printf( "%f\n", f ); return 0; }; }; // ... int ( foo::*fun )( float ) = &foo::bar; foo x; (x.*fun)( 3.1415f );
Geht!
@PCShadow:
C-/C++-Quelltext
1 std::vector<std::string>::const_iterator i, j;
Zitat
Sag ich doch , dass der Zeiger nur ein Offset speichert und man es nur über Objektpointer->*Funktionspointer aufrufen kann. Ohne das Objekt zu kennen funktioniert es nicht.
Außer man hat irgendeine Funktion vorgegeben, die einen Funktionszeiger haben möchte.Zitat von »"David_pb"«
Zitat
Sag ich doch , dass der Zeiger nur ein Offset speichert und man es nur über Objektpointer->*Funktionspointer aufrufen kann. Ohne das Objekt zu kennen funktioniert es nicht.
Na also! Dennoch ist es möglich Methoden per Funktionszeiger auf zu rufen. Und natürlich brauchst man eine Instanz dafür... Sonst wär das ja auch ziemlich witzlos...
Letzere kann man ja durchreichen... Kein Problem also!
Zitat von »"Genion"«
@PCShadow
Die Methode alles statisch zu machen sollte von der boshaftigkeit in Richtung globaler Variablen gehen. Also geh sorgfältig damit um.
Werbeanzeige