Klasse implementieren



  • Guten Abend alle miteinander

    Ich behaupte mal zu wissen wie man mit Klassen arbeitet, dennoch hänge ich z.z. an einem Problem das sich meinem Verständnis enzieht.

    Ich habe folgende Klasse definiert:

    class CGameEngine
    {
    public:
    	CGameEngine();
    	~CGameEngine(void);
    
    	void SetWindowHandle(HWND WHND); 
    .
    .
    .
    

    und diese im Hauptprogramm instanziert (global):

    #include "GameEngine.h"
    
    CGameEngine GaE();
    

    soweit so gut, allerdings wenn ich nun in der WinMain Funktion die Funktion SetWindowHandle() aufrufe, kriege ich vom Compiler einen C2228 Error ("error C2228: left of '.SetWindowHandle' must have class/struct/union")

    GaE.SetWindowHandle(hwnd);
    

    Ich wette es ist etwas super simples aber ich steh echt aufm Schlauch. Hoffe einer von euch kann mir einen Wink mit dem Zaunpfahl geben.

    VG
    ghost



  • Du instanzierst da keine Variable, sondern deklarierst eine Funktion.

    Wenn du das nicht global, sondern lokal gemacht hättest, hätte dir das dein Compiler sogar gesagt.



  • wenns denn so wäre.

    ehrlichgesagt verstehe ich nicht ganz wieso

    CGameEngine Gae()
    

    keine Klasse instanziert bzw. was da eigtl. den Fehler hervorruft. Aus deinem Post les ich herraus, dass es sich um ein grundlegendes strukturellles Probelm handelt aber alles andere bleibt mir schleierhaft.



  • lass einfach die klammern weg



  • Das was du da machst ist nichts weiteres als das hier:

    int foo();
    

    Einfach mit einem anderen Rückgabetypen und anderem Namen. Und ist grundlegend verschieden von dem hier:

    int foo;
    

    Alles klar?

    Knapp gesagt: Klammern weg lassen, aber ich hoffe du verstehst das Problem jetzt.



  • Der Compiler interpretiert den Code CGameEngine Gae(); als Deklaration einer Funktion, die eine Game-Engine zurückgibt - und nicht (wie du erwartet hättest) als ein default-konstruiertes Objekt. Wenn du ein Objekt erstellen willst, funktioniert:

    CGameEngine Gae;
    //oder
    CGameEngine Gae = CGameEngine();
    

    @drakon: Funktionsdeklarationen sind auch lokal erlaubt, auch wenn sie nicht viel Sinn machen 😉



  • CStoll schrieb:

    @drakon: Funktionsdeklarationen sind auch lokal erlaubt, auch wenn sie nicht viel Sinn machen 😉

    Dem habe ich nicht widersprochen. 😉
    Aber ich hatte tatsächlich im Kopf, dass da wenigstens eine Warnung kommt, aber VS2010 bringt doch keine.



  • Ich wäre extrem vorsichtig damit, WinAPI Funktionsnamen in eigenen Funktionen zu verwenden.
    Hintergrund: Die WinAPI deklariert viele Funktionen als Präprozessor-Makros.

    zb

    #ifdef _UNICODE
    #  define MessageBox MessageBoxW
    #else
    #  define MessageBox MessageBoxA
    #endif
    

    Wenn du jetzt selbst MessageBox als Bezeichner verwendest,kannst du dir denken was passiert ...



  • Oh man!
    Jetzt ergibt alles einen Sinn. Manchmal sieht man echt den Wald vor lauter Bäumen nicht. Danke euch!

    @Ethon: Ist ehr unabsichtlich. Der Name war halt passend für das was die Funktion tut aber du hast natürlich recht. Ich werde den Namen was abändern.

    VG
    ghost


Anmelden zum Antworten