Variable Argumentenliste weitergeben



  • Hallo,

    Ich habe folgende Klasse:

    class CMyClass{
    protected: 
    	void SendMessage(unsigned int MsgID,...);
    	virtual void OnMessage(unsigned int MsgID,...) = 0;
    public:
    	CMyClass();
    	virtual ~CMyClass();
    
    };
    

    von dieser Klasse abgeleitete Klassen implementieren alle eine OnMessage-Funktion. Ziel ist es alle Objekte zu erreichen die CMyClass als Vorfahr haben.

    die Implementation von SendMessage:

    BaseClassList ist ein vector <CMyClass*> der alle erzeugten Objekte von CMyClass enhält.

    void CMyClass::SendMessage(unsigned int MsgID,...)
    {
    	va_list Params;
      va_start(Params, MsgID);              // Aufruf an Initialisierungmakro
    
    	for(unsigned int i=0; i < BaseClassList.size();i++)
    		BaseClassList[i]->OnMessage(MsgID,Params);
    
    	va_end(Params);                        // Schliessmakro
    }
    

    Mein Problem besteht darin, dass wenn ich die SendMessage aufrufe im OnMessage des Objekt Datenmüll ankommt( MsgID stimmt, der Rest ist Murks). Innerhalb von SendMessage haben die Argumente noch den richtigen Inhalt. Mache ich bei der Übergabe der Argumente einen Fehler oder habe ich ein anderes Verständisproblem?

    Grüße
    NewOne



  • Gib doch einfach va_list weiter.


  • Mod

    Ja, gib einfach etwas vom Typ va_list weiter. Das Problem, das du hier hast ist, dass eine Params eben keine variable Argumentliste ist, sondern nur Darstellung einer variablen Argumentliste. Es "sollte" theoretisch auch funktionieren, wenn du in OnMessage die Parameterliste zweimal entpackst, aber da ist der Vorschlag, gleich die entpackte Liste weiterzugeben viel einfacher.



  • va_list ist doch nur der Typ.
    Den kann ich doch gar nicht weitergeben.
    Irre ich mich?


  • Mod

    Etwas vom Typ va_list.



  • Ich bin nu leicht irritiert....
    Wie gebe ich denn die gepackte Liste weiter?
    Muss ich Sie erst entpacken und dann zu einer neuen zusammenpacken?
    Steh grad auf dem Schlauch.
    va_list Params; erzeugt doch eine "leere" Liste ohne Zusammenhang.
    erst mit va_start läd der doch die Params der Funktion in die Liste, oder?



  • Ausserdem gebe ich doch was von Typ va_list weiter:

    BaseClassList[i]->OnMessage(MsgID,Params);
    


  • Und die Signatur von OnMessage muss dann so aussehen:

    virtual void OnMessage(unsigned int MsgID, va_list params)
    

  • Mod

    NewOne schrieb:

    Ausserdem gebe ich doch was von Typ va_list weiter:

    BaseClassList[i]->OnMessage(MsgID,Params);
    

    Ja, aber OnMessage erwartet nichts vom Typ va_list. OnMEssage sieht nur: Oh, ich habe zwei Argumente bekommen, der erste ist eine Zahl, den Rest kenn ich nicht. Dann machst du in OnMessage wahrscheinlich wieder sowas:

    va_list Params;
      va_start(Params, MsgID);
    

    Jetzt kann man aus Params die übergebenen Argumente extrahieren. Und das übergebene Argument war vom Typ einer va_list die die Argumente enthält, die ursprünglich an SendMessage übergeben wurden, es sind nicht direkt die Argumente die an SendMessage übergeben wurden. Das heißt, du müsstest diese va_list nochmals entpacken um an die Argumente von SendMessage zu kommen.

    Oder du machst es wie vorgeschlagen und schreibst dein OnMessage so:

    void CMyClass::OnMessage(va_list &Params) // Oder als Kopie, je nachdem was du brauchst
    {
    
    // Kein va_start nötig, war ja schon in SendMessage
    
    [...Arbeitest wie gewohnt mit va_args...]
    
    }
    


  • Achso Danke! Gepackte Liste als EIN Argument übergeben und behandeln!
    Ich hatte das falsch verstanden.

    Danke


Anmelden zum Antworten