statische Methoden



  • Hallo,

    Ich gehöre noch zu den C++ Anfängern und habe ein für mich riesiges Problem.
    Würde mich wirklich sehr freuen, wenn mir jemand helfen könnte.

    Ich weiß bereits, dass in statischen Methoden der this-Zeiger konstant ist und ich somit keine Membervariablen ändern kann.

    Was aber wenn ich genau das tun will?

    Hier mein momentaner Code etwas genauer, ich hoffe es ist verständlich?

    Ich habe eine Klasse initialize in der ich diese Methode deklariere

    static void capture_Macadress_PCU(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
    

    sie sieht so aus

    void initialize::capture_Macadress_PCU(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
    {
    	arp_proto *arp;
    	arp = (arp_proto *) (pkt_data);
    
    	if ((arp->ip_sender.byte1==192) && (arp->ip_sender.byte2==168) && (arp->ip_sender.byte3==17) && (arp->ip_sender.byte4==110))
    	{
    	printf("Quelle:  %d.%d.%d.%d.%d.%d\n",
    		arp->mac_src.byte1,
            arp->mac_src.byte2,
            arp->mac_src.byte3,
    		arp->mac_src.byte4,
    		arp->mac_src.byte5,
    		arp->mac_src.byte6
            );
    
    	pcap_breakloop(handle);
    }
    }
    

    Aufgerufen wird diese Methode hier (als Callback bis eben pcap_breakloop ausgeführt wird)

    pcap_loop(initialize::adhandle,0, initialize::capture_Macadress_PCU, NULL);
    

    Mein Vorhaben
    Ich möchte gerne statt der ausgabe s.h. oben

    printf("Quelle:  %d.%d.%d.%d.%d.%d\n",
    		arp->mac_src.byte1,
            arp->mac_src.byte2,
            arp->mac_src.byte3,
    		arp->mac_src.byte4,
    		arp->mac_src.byte5,
    		arp->mac_src.byte6
            );
    

    diese Werte in Memvervariablen schreiben.

    Meine Frage:
    Ist das irgendwie möglich, aus statischen Methoden auf Membervariablen zu schreiben?
    Oder muss ich alles umstrukturieren - falls ja wie?

    Würde mich wirklich sehr über Hilfe, Anregungen, Tipps.. freuen.
    Vielen dank im voraus.

    Gruß Tupo13



  • Die Frage basiert auf falschen Annahmen.

    Tupo13 schrieb:

    Ich weiß bereits, dass in statischen Methoden der this-Zeiger konstant ist und ich somit keine Membervariablen ändern kann.

    Der this-Zeiger ist nicht konstant, es gibt ihn in statischen Funktionen garnicht. Das heißt, statische Funktionen beziehen sich auf die Klasse, aber auf kein Objekt. Deswegen ist es möglich, A::static_method() aufzurufen, statt A_obj.static_method(), was aber auch funktioniert. Statische Funktionen können nur auf statische Member zugreifen.
    geloescht



  • @ geloescht
    OK, vielen Dank für deine Antwort.

    Ich kann also auf keinen Fall auf Member-Variablen in statischen Methoden zugreifen !

    Wie kann ich das dann anders organisieren? Wie kann ich aus der statischen Methode eine nicht-statische machen?

    Beim Funktionsaufruf in der Callbackfunktion (Parameter 3) werden ja keine Parameter angegeben ?????

    pcap_loop(initialize::adhandle,0, initialize::capture_Macadress_PCU, NULL);
    

    vielen Dank im voraus für eure Hilfe
    Gruß Tupo13



  • Tupo13 schrieb:

    Ich kann also auf keinen Fall auf Member-Variablen in statischen Methoden zugreifen !

    Doch 😃 wenn die die Member-Variablen, static Variablen sind 😉



  • Du könntest dir auch innerhalb der static Methode ein definiertes Objekt besorgen und dann auf dessen Member-Variablen zugreifen, z.B.:

    class X
    {
      int m_val;
    public:
      static void global_f();
      static void local_f();
    
      void do_something();
    }
    
    x theX;
    void X::global_f()
    {
      theX.do_something();
      theX.m_val=7;
    }
    
    void x::local_f()
    {
      X myX;
      myX.do_something();
      myX.m_val=7;
    }
    


  • @ Freak_Coder damke
    Das einzige was ich machen will ist eigentlich, das was ich in der statischen Methode ausgebe, in ein Array zu schreiben, ist das wirklich unmöglich?

    Hat jemand schon einmal was von LibSigC++ gehört?
    Könnte es damit gehen?
    Gibt es denn keine Möglichkeit?

    sollte das unbedingt hinkriegen! und benötige unbedingt HILFE

    Vielen Dank im voraus
    Gruß Tupo13



  • @ CStoll

    Sorry, haben wohl grad gleichzeitig geschrieben?

    Vielen Dank, weiß zwar noch nicht ganz genau wie du das meinst werde es mir aber sofort anschauen.

    Kannst dir garnicht vorstellen wie froh ich über einen Lösungsvorschlag bin
    -Danke



  • Super

    @CStoll - das wars was ich gesucht habe.

    Danke
    ein glücklicher Anfänger



  • Tupo13 schrieb:

    Vielen Dank, weiß zwar noch nicht ganz genau wie du das meinst werde es mir aber sofort anschauen.

    Dann etwas ausführlicher: Um nichtstatische Member-Elemente verwenden zu können, benötigst du ein konkretes Objekt. Eine "normale" Methode hat dafür "*this", bei einer statischen Methode fehlt der this-Zeiger und du mußt dir dein Objekt woanders beschaffen. (das kann eine globale Variable sein wie im ersten Beispiel, eine lokale Variable wie im zweiten Beispiel oder was auch immer - du könntest auch mit "static void func(X& myX);" ein Objekt als Parameter übergeben oder mit Hilfe der Parameter das richtige Objekt in einer std::map<irgendwas,X> suchen)



  • Noch eine Frage:

    Ich hoffe, ich blamier mich nicht:

    aber warum funktioniert das dann nicht? (in der statischen Funktion)

    initialize init;
    
    Ip_addr *destIPadr;
    destIPadr=(Ip_addr *) (init.destIP);
    
    std::cout <<destIPadr->byte1<< std::endl;
    

    Gruß Tupo13



  • @CStoll
    Leider funktioniert dein Beispiel nicht,
    wenn ich so auf Membervariable zugreife lesend oder schreibend bekomme ich immer einen unsinnigen Wert.

    Auf normale Methoden lässt er mich auch nicht zugreifen

    Mache ich etwas falsch?

    Gruß Tupo13



  • Das wurde zwar AFAIK schon mal gesagt, aber in statischen Member-Methoden arbeitest du OHNE eine Instanz von dem Objekt, d.h. die nicht statischen Member (Methoden) existieren nicht, deshalb kein Zugriff.



  • Tupo13 schrieb:

    @CStoll
    Leider funktioniert dein Beispiel nicht,
    wenn ich so auf Membervariable zugreife lesend oder schreibend bekomme ich immer einen unsinnigen Wert.

    Was meinst du mit "unsinniger Wert"?



  • @CStoll

    Also als unsinniger Wert bekomme ich
    -858993460 statt z.B. 10

    Aber so wie GPC sagt funktioniert das so sowieso nicht - oder doch?



  • Ein Beispiel:

    struct Foo {
      static void staticMethod(int);
    private:
      static int statMem;
      int nonStatMem;
    };
    
    int Foo::statMem = 0;
    
    void Foo::staticMethod(int i) {
      statMem = i;  //Geht, da statMem static ist
      //nonStatMem = i;  //Crash! nonStatMem ist nicht static!
    };
    


  • @ GPC

    OK danke, jetzt hab ichs endlich mal soweit kapiert.

    nur muss man es so schreiben

    int Foo::statMem = 0;
    

    Danke Gruß Tupo13


Anmelden zum Antworten