Funktion in Klasse aufrufen [WinApi]
lima-city → Forum → Programmiersprachen → C/C++ und D
aussehen
beitrag
compiler
datei
derweil
entwicklungsumgebung
fehler
funktion
fr
instanz
klammern
klasse
lstigen warnings
mglichkeit
null
parameter
quelltext
schlsselwort
singleton
warnung
-
Hi
Ich hab eine Klasse und eine Funktion, die nichts mit der Klasse zu tun hat. Jedoch möchte ich in dieser Klasse auf die Funktion verweisen.
Genauer:
Ich habe eine Klasse zum einfachen erzeugen von WinApi Elementen. Das Hauptfenster benötigt einen Verweis auf die "WindowProc" Funktion. (Verwalted Windows-Messages). Normalerweise funtkioniert es einfach, indem ich den Namen der Funktion übergebe (wcs.wndProc = WindowProc; //nicht exakt, aber so ähnlich). Wenn ich jetzt jedoch in einer Klasse darauf zugreife klappt es nicht (irgendwie auch logisch)
class CClass{ public: void MyFunc(); } void CClass::MyFunc(){ wcs.wndProc = WindowProc; }
Wie greife ich also in einer klasse auf eine externe Funktion zu?
mfg
PD -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Compiler Fehler. (undefined reference to [irgendwas]WindowProc) Wenns weiterhilft, kann ich auch heute noch den genauen Fehler posten.
Compiler: Dev-Cpp -
Aus dem bisschen Codeschnipsel geht hervor, dass du WindowProc global definiert hast (wenn überhaupt). Wenn du das in einer anderen Datei gemacht hast, musst du die Funktion mit der extern-Anweisung in die Headerdatei deiner Klasse mit einbinden.
Noch ein Tip: C- und C++-Funktionen haben verschiedene Aufrufkonventionen (siehe Stichwörter thiscall und __cdecl in der MSDN).
Beitrag geaendert: 27.3.2007 16:58:01 von tischfussball -
Ja WindowProc ist (derweil noch) global, aber der header ist includiert ;)
Der genaue Fehler lautet:
[Linker error] undefined reference to `_Z10WindowProcP6HWND__jjl@16'
Er kommt, seit ich folgenderweise probiere auf die Funktion WindowProc zuzugreifen:
wcs.lpfnWndProc = WindowProc;
Würde ausserdem gerne wissen, wie ich dieses lästige Warning loswerde:
[Warning] passing NULL used for non-pointer converting 1 of `HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__*, HMENU__*, HINSTANCE__*, void*)'
ensteht durch:
CreateWindowEx(NULL, Name, Name, WEStyle, CW_USEDEFAULT, CW_USEDEFAULT, Width,Height, NULL, NULL, m_hInst, NULL);
mfg
PD
Beitrag geaendert: 27.3.2007 18:34:19 von pinkdragon -
Für das erste Problem wie gesagt das Schlüsselwort "extern" benutzen. Und das andere... mal schauen, ob es dann überhaupt noch auftritt.
-
Oh stimmt, das wäre ne Möglichkeit (wenn auch keine sehr schöne). Werde es vorher noch mit Singletons versuchen.
Nur Warnung hatte ich schon immer... liegt wahrscheinlich am Combiler aber man müsste doch irgendwo solche lästigen Warnings abschalten können... (nur gefunden hab ich derweil noch nichts) -
Nur Warnung hatte ich schon immer... liegt wahrscheinlich am Combiler aber man müsste doch irgendwo solche lästigen Warnings abschalten können... (nur gefunden hab ich derweil noch nichts)
Besser ist's i.Allg., einfach sauberer zu Programmieren, denn das wirkt sich auch positiv auf die Programmstabilität aus. Die Warnungen sind nicht überflüssig, die Compilerentwicklerhaben sich da schon was bei gedacht ;)
MFG,
thw -
Nur was gibt es in dem Fall sauberer zu programmieren? Ich will dem Pointer nichts übergeben, und übergebe daher NULL. Soll ich statt dessen eine neue Variable (NULL-pointer) erstellen, nur um diesen übergeben zu können? oO Auch kommt der Warning bei anderen Entwicklungsumgebungen nicht. (afair: Visual C++ Net)
-
wegen der warnung : glaube es liegt daran daß du versuchst einem dword einen NULL zeiger zu übergeben ändere einfach den ersten parameter in 0
wegen deinem prob : wenn windowproc ne funktion is wo sind die parameter klammer müsste es nicht so aussehen WindowProc(blablaparameter);
veileicht versuchst du ja auf ein privates element einer klasse zuzugreifen da kannst du dann so viel includieren wie du willst und wird trotzdem nicht funktionieren
könnte auch sein das du so einfach nicht auf die instanz wcs nicht zugreifen kannst von deiner methode aus vieleicht solltest du mal den zeiger auf die instanz an MyFunc(* klassenname von wcs) übergeben und das dann benutzen
es is schwer ein fehler zu beheben ohne den gesamten relevanten quelltext
;) -
1) Jo mit der 0 funktioniert es jetzt. Danke!
2) Thx fürs erklären, aber ich hab mich entschlossen Plattform unabhängig zu Programmieren und verzichte daher auf WinApi und DirectX...
"wegen deinem prob : wenn windowproc ne funktion is wo sind die parameter klammer müsste es nicht so aussehen WindowProc(blablaparameter);"
Dann sollte dieser Aufruf aber auch nicht innerhalb der WinMain Funktion möglich sein, was er aber ist.
Geht nicht, aber folgendes geht:void CClass::MyFunc(){ wcs.wndProc = WindowProc; }
int WinMain(...){ //WindowProc wird aber nicht! übergeben wcs.wndProc = WindowProc; }
"es is schwer ein fehler zu beheben ohne den gesamten relevanten quelltext"
:P Das war aber schon alles
Trotzdem Danke fürs helfen! (geht an alle ;))
mfg
PD -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage