Übergabe von nichtstatischen Member?



  • Hi Leute!

    Ich möchte gerne der Funktion StartWinMain(hw) eine Zeiger auf eine Struktur
    übergeben. (In diesem Fall ist der Name "hw".)
    Ich bekomme aber folgende Fehlermeldung:

    error C2597: Ungültiger Verweis auf nicht-statischen Member 'ViewHexapod::hw'

    Mein Problem: hw darf nicht static sein und auch nicht global.

    Wie kann ich das trotzdem lösen?

    #include "viewHexapod.h" 
    #include "drawWindow.h" 
    #include <windows.h> 
    #include <math.h>
    
    class ViewHexapod : public mb::Module 
    { 
    public: 
    
    	static DWORD WINAPI ThreadFunc(LPVOID lpParam)
    	{
    		StartWinMain(hw);		// Ausführen der Funktion zum 
                                                       Anzeigen der Darstellung. 
    		return 0; 
    	}
    
    	ViewHexapod()
    	{
    		hw = new HexapodWerte(); 
    		DWORD dwThreadId, dwThrdParam = 1; 
    		hThread = CreateThread(NULL, 0, ThreadFunc, &dwThrdParam, 0, 
                              &dwThreadId); 
    
    	}
    
            ...
    
    protected:
    private:
    	HexapodWerte * hw;
            HANDLE hThread; 
    };
    
    struct HexapodWerte
    {
    	int x_1, x_2, y_1, y_2, zs1, zs2, zv1, zv2;
    };
    

    MfG,
    Matthias!



  • Statische Methoden können nur auf statische Member zugreifen (schließlich haben sie kein eigenes this-Objekt, das sie nutzen können). Also MUSST du entweder dein Objekt static machen oder du übergibst der Methode das richtige Objekt als Parameter (dann müsstest du den lpParam richtig casten und weiterreichen).



  • Danke für den Tip, aber mein Problem ist, dass sich das Objekt, also die Werte der Variablen in der Struktur sich 10 mal in der Sekunde ändern und die Funktion, die den Zeiger der Stuktur übergeben bekommt, dann nur den Aktuellen Wert ausliest und
    weiterverarbeitet.
    Da ich die Methode StartWinMain nur einmal aufrufe und sie dann ständig weiterläuft, kann ich auch nur einmal einen Wert übergeben.
    Wenn ich mein Objekt static mache, dann kann ich ja die Werte nicht mehr ständig ändern.

    Vielleicht gibts ja noch ne andere Lösung.

    MfG,
    Matthias!



  • Winz schrieb:

    Zeiger der Stuktur übergeben bekommt

    Die Werte in der Struktur auf die der Zeiger zeigt ändern sich, aber der Thread bekommt es nicht mit? Oder wie?!



  • [quote]Die Werte in der Struktur auf die der Zeiger zeigt ändern sich, aber der Thread bekommt es nicht mit? Oder wie?![/quote]

    Doch, doch, der Thread bekommt alles mit und es funktioniert auch alles wenn der Zeiger auf die Struktur "HexapodWerte * hw" global ist.

    Das Problem: "HexapodWerte * hw" darf nicht global sein!!!

    Wenn ich ihn aber als private deklariere, bekomme ich die besagte Fehlermeldung.

    error C2597: Ungültiger Verweis auf nicht-statischen Member 'ViewHexapod::hw'

    MfG,
    Matthias!



  • Dann übergib doch hw wie CStoll gesagt hat als Parameter der StartThread. Dann kann hw lokal in ViewHexapod() oder private sein.



  • Normale Membervariablen existieren nur innerhalb des umgebenden Objektes - also mußt du irgendwo dieses Objekt ablegen, das du verwenden willst. Und da bleiben dir nur zwei Möglichkeiten: globale Variable oder statische Membervariable.

    (die dritte Möglichkeit wäre es, das Objekt lokal in der ThreadFunc() anzulegen - aber dann kommst du nicht mehr von außen dran)



  • Ich habs!!! 😃

    Ich ändere den Konstruktor Folgendermaßen:

    ViewHexapod()
    {
    hw = new HexapodWerte();
    LPVOID ThrdParam = this;
    DWORD dwThreadId, dwThrdParam = 1;
    hThread = CreateThread(NULL, 0, ThreadFunc, ThrdParam, 0, &dwThreadId);
    }

    und ändere die Threadfunktion so:

    static DWORD WINAPI ThreadFunc(LPVOID lpParam)
    {
    ViewHexapod * self = reinterpret_cast<ViewHexapod *>(lpParam);
    StartWinMain(self->hw);
    return 0;
    }

    So bleibt mein Zeiger auf die Struktur private und nicht static und ich kann
    sie trotsdem übergeben.

    Danke für alle Hilfe!

    MfG,
    Matthias!


Anmelden zum Antworten