Du bist nicht angemeldet.

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

11

16.10.2008, 21:09

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"
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.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

16.10.2008, 21:10

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...
@D13_Dreinig

13

16.10.2008, 21:20

Zitat 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...
Tut es bei mir persönlich nicht. Dann kommen Fehlermeldungen wie
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

14

16.10.2008, 21:20

ok, meine Idee, die Entsprechenden Membervariablen statisch zu machen, hat auch funtkioniert :lol:
jetz hab ich allerdings noch zwei seltsame Fehler:
der Code:

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();
//...

}

der Fehler:

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>        ]

Was ist da los? Ok, ich hab auch nicht so viel Ahnung von der STL, ich weiß darüber nicht viel mehr wie das, was in "C++ für Spieleprogrammierer" steht

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

16.10.2008, 21:26

Zitat von »"Genion"«

Zitat 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...
Tut es bei mir persönlich nicht. Dann kommen Fehlermeldungen wie
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; 
@D13_Dreinig

16

16.10.2008, 21:32

Zitat von »"David_pb"«

Zitat von »"Genion"«

Zitat 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...
Tut es bei mir persönlich nicht. Dann kommen Fehlermeldungen wie
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; 
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. ;)

@PCShadow
Die Methode alles statisch zu machen sollte von der boshaftigkeit in Richtung globaler Variablen gehen. Also geh sorgfältig damit um. ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

16.10.2008, 21:37

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!
@D13_Dreinig

18

16.10.2008, 21:39

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!
Außer man hat irgendeine Funktion vorgegeben, die einen Funktionszeiger haben möchte. :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

19

16.10.2008, 21:47

Dann schreibt man halt einen Wrapper und reicht diesem die Instanz mit...
@D13_Dreinig

20

17.10.2008, 12:56

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. ;)

naja, ich hab die statischen Variablen immer noch private, und da es sowieso ein Singleton ist ;)

@David: das funktioniert, danke

jetz hab ich aber Probleme mit dem Linker, und zwar genau genommen mit der initialisierung der statischen Variablen von Win: wenn ich sie im Header initialisiere, beschwert der Linker sich über eine Mehrfachdefinition, da der Header ja in meheren .obj-Dateien enthalten ist, wenn ich sie in die win.cpp packe, über unaufgelöste externe Verwiese :?

Werbeanzeige