static funktion verwenden, weiss echt nicht mehr weiter



  • also ich hab folgendes problem

    in meiner dlg.h hab ich stehen ( hab code uebernommen )

    static int CALLBACK OnlineCallBack(int nStatus, strTraceMessageData* pTraceData, void* pWnd);
    

    in der cpp steht am anfang

    int CALLBACK CRunDlg::OnlineCallBack(
    						int Status,						
    						strTraceMessageData* pTraceData, 
    						void* pWnd					
    
    )
    {
    	strTraceMessageData*	pNewTraceData;
    	int						nLength;
    
    	CRunDlg*	pThis=(CRunDlg*)pWnd;
    
    	pThis->m_TraceStatus=Status;
    
    // und so weiter und so weiter
    

    jetzt hab ich ne public int variale in meiner .h stehen. diese moechte ich in der fkt. erhoehen. also hab ich es mit einer referenz versucht

    und dann noch nach void* pWnd noch ,int &meinevar

    eingegeben
    dann hab ich in der fkt.

    meinevar++; // gemacht. aber ist waehrend der laufzeit abgestuerzt :(
    

    also dach ich mir

    ok ohne ref. dann rufst halt ne fkt auf

    also alles ganz normal gelassen, sprich wie vorher ( programm geht auch wunderbar )

    und hab noch ne fkt hinzugefuegt die meine variable um 1 erhoeht

    dann ruf ich die fkt in der onlinecallback auf.

    // in der .h
    
    	static int arise_count_messages();  // static sonst meckert er. WARUM eigentlich?
    
    	static int count_messages_forrate;  // musste ich auch static machen, warum den wieder?
    

    jetzt bring er mir ne fehlermeldung

    error LNK2001: unresolved external symbol "public: static int CRunDlg::count_messages_forrate" (?count_messages_forrate@CRunDlg@@2HA)

    das ist zum flennen. wie kann ich den da einfach ne variable hochzehlen, verflixt und zugenaeht. bitte kann mir da einer helfen? dank im voraus



  • Hi newkid,

    ist Dir klar was static members sind?

    Fall nein, lies folgendes:
    Eine static variable ist der Klasse zugeordnet und nicht der objekt instanz. Das heißt Es gibt sie nur einmal für alle abjekte dieser Klasse.

    #inlcude <iostream.h>
    class A{ public: static int i; };
    int A::i = 99;
    int main(int argc, char* argv[])
    {
    	A a1;
    	A a2;
    
    	cout << a1.i << endl;
    	a1.i = 0;
    	cout << a1.i << endl;
    	a2.i = 100;
    	cout << a1.i << endl;
    }
    

    Das Beispiel soll zeigen, daß es egal ist ob Du auf i durch a1 oder a2 zugreifst, einfach weil es nur einen Speicherplatz für beide gibt.
    Außerdem siehst Du wie die variable korrekt initialisiert wird, damit verschwindet dein Linker error. Per definition werden statische variablen außerhalb der Klassen definition initialisiert. In Deinem Fall in der .cpp
    Der große Unterschied bei statischen Funktionen ist, daß kein this pointer übergeben wird. Das heißt Du kannst in einer statischen funktion nicht schreiben

    this->MyVar++;
    

    was gleichbedeutend ist mit:

    MyVar++;
    

    Aber nur wenn die gleiche Variable nicht lokal ( in der Funktion ) überschrieben wurde, denn dann gilt die lokale Version. Da ein Teil bei deinem Code fehlt bzw. nur grob beschrieben wurde, könnte da der Grund liegen warum Dein Zugriff auf die Member variable compiliert wurde obwohl Du in einer statische funktion warst.
    Übrigens, um das ganze zu lösen, benutze den pThis pointer in der Funktion, denn dafür ist er da.

    pThis->MyVar++;
    

    das sollte gehen, sonst liegt der wurm nochmal ganz woanders
    Gruß
    Ingo



  • also danke für die erläuterungen, hmm was man wieder neu lernt alles. cool

    also du meinst ich soll ganz normal eine variable nehmen

    und dann einfach in der static fkt.

    pThis->Var++;

    und das geht auf jedenfall? cool

    bin erst am montag/dienstag am platz

    ist aber wichtig das ich da ne variable hochzähle. da ich trace und die fkt. aufgerufen wird, falls was getraced wird.

    hmmm ich hoff es geht.



  • wie kann ich dir danken????

    also

    DANKE MERCI

    hat geklappt

    was sehr gut ist

    du sagst nicht nur die loesung, sondern vermittelst gut noch das hintergrundwissen dazu. 👍 👍

    so leute wie dich braucht das forum 🙂

    gruss

    newkid


Anmelden zum Antworten