Class Pointer



  • hi.
    Ich hab in der suche nix darüber gefunden, also muss ich diese simple Frage wohl doch hier stellen.
    Ich hab eine klassenstruktur, die ungefähr so aussieht:

    class WindowA {
        public:
        class WindowB {
            public:
            static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
            private:
            HWND m_hwnd;
            WindowB *Next;
            .
            .
            .
        }
    
        private:
        HWND hwnd;
        .
        .
        .
    };
    

    Mein Problem ist jetzt, dass ich nicht weiß, wie ich auf die addresse der WndProc komme (um das lpfnWndProc Member der WNDCLASS zu füllen).
    habs mit WindowA::WindowB::WndProc probiert ... funzt aber nit.

    Ich hoff ich hab mich verständlich ausgedrückt.



  • Hi,

    Afair geht das überhaupt nicht.

    Du müsstest ne externe Funktion haben die dann übergeben wird, so wie es immer mit WNDPROC ist

    :xmas1: :xmas2:

    MfG



  • Skars schrieb:

    habs mit WindowA::WindowB::WndProc probiert ... funzt aber nit.

    Das sollte es aber. Warum funktioniert es denn nicht? Logischer Fehler? Compilerfehler?



  • wenn die funktion als static deklariert is, funzts schon (wenn ichs auf WNDPROC caste) ... aber lieber hätt ichs als nich-static..weil ich jja dann die keinen zugriff auf die vars der instanzen hab.



  • Du kannst doch an die Adresse nur über konkrete Instanzen kommen, oder?
    -> &instance_of_a.instance_of_b.WndProc



  • Skars schrieb:

    aber lieber hätt ichs als nich-static..weil ich jja dann die keinen zugriff auf die vars der instanzen hab.

    Das geht so nicht, da ein non-Member Funktionszeiger was anderes ist als ein Member Funktionszeiger.
    Du kannst aber beim Erstellen des Fensters einen Zeiger auf die Instanz der Klasse speichern. Das sieht dann ungefähr so aus

    SetWindowLongPtr(handle_, GWLP_USERDATA, this);
    

    handle_ ist das Fensterhandle (HWND) und this ist deine jeweilige Instanz. Wenn nun deine WndProc aufgerufen wird, holst du dir über den hWnd Parameter einfach wieder deine Instanz zurück

    WindowB* this_ = reinterpret_cast<WindowB*>(GetWindowLongPtr(hWnd, GWL_USERDATA));
    

    Es gibt sicherlich auch noch andere Möglichkeiten, diese ist jedoch relativ simpel realisiert.



  • jo, danke ... ich werd dann ma guggn ob ichs hinkrieg.
    greetz u. fröhliche weihnachten .... hmm...bin ich wohl 6 1/2 stunden zu spät 🙄



  • so ich nochma ... ein problem hab ich da noch - in WindowA ist das hWnd in das ich die userdata speicher (speichern tu ichs aber im Konstruktor von WindowB). Aber der verlangt natürlich dann nach einem Objekt von WindowA.
    Das hab ich nicht .... ich dachte der kann automatisch auf seine Parentclass zugreifen ... und als friend isses auch deklariert, nich dass die frage mit wegen private kommt.
    Was kann ich da am besten machen?



  • oh, und was ich noch sagen wollte, das kann ich natürlich nicht mit SetWindowLong() lösen (nicht dass ihr euch denkt dass die antwort ja schon oben ist) weil ich ja kein window hab dem ich das "setten" kann.



  • Skars schrieb:

    in WindowA ist das hWnd in das ich die userdata speicher (speichern tu ichs aber im Konstruktor von WindowB). Aber der verlangt natürlich dann nach einem Objekt von WindowA.
    Das hab ich nicht .... ich dachte der kann automatisch auf seine Parentclass zugreifen

    Nein. Wenn ein WindowB Objekt estellt wird, bedeutet das ja nicht, dass auch ein WindowA Objekt erstellt wird. WindowB ist lediglich eine nested class, definiert somit lediglich einen Typen innerhalb von WindowA. Am einfachsten wäre dein Problem wohl mit einem Parameter im ctor von WindowB zu lösen, der die Instanz von WindowA bereitstellt.
    Ich glaube allerdings, dass du kein Programmierproblem hast, sondern ein Designproblem. Was hast du eigentlich mit dieser Window-Window Verschachtelung vor?



  • Ich glaube allerdings, dass du kein Programmierproblem hast, sondern ein Designproblem.

    Das glaube ich auch. Ist mein erstes Objektorientiertes Projekt ... hab mir da halt son script durchgelesen und dann angefangen nachdem ichs "eigentlich" verstanden hab. Aber da stehen natürlich nicht alle Feinheiten drin, sondern die Möglichkeiten grob erklärt. Vererbung, Polymorphie usw.

    Am einfachsten wäre dein Problem wohl mit einem Parameter im ctor von WindowB zu lösen

    guck, da fängts schon an 😉 was isn ctor, oder is des ein begriff von dir den du noch erläutern könntest? *G*

    Was hast du eigentlich mit dieser Window-Window Verschachtelung vor?

    Das war jetzt nurn sample wie meine klasse in etwa aussieht weil der komplette code etwas zu lang zum posten wäre. Aber es handelt sich trotz alledem um ein Parentwindow, mit mehreren childwindows. Jedoch gehts ja Hauptsächlich um was anderes, deshalb das C++ Forum.



  • Achso ok. Hat sich erledigt; ich nehme an du meintest den constructor. Ich werde es so probiern ... sollte funktionieren, da hast du wohl recht 🙂



  • Skars schrieb:

    guck, da fängts schon an 😉 was isn ctor, oder is des ein begriff von dir

    Nee. Keine Ahnung woher das stammt, aber ich glaub das hat irgendein Programmierer mal rausgehauen, weil diese nunmal (mich eingeschlossen) von Haus aus schreibfaul sind. 😃
    ctor = constructor
    dtor = destructor


Anmelden zum Antworten