Dynamische Parameterübergabe & Inline Containers



  • Warum übergibst du kein Array oder einen vector?

    Shade of Mine hat doch bereits gesagt, dass variable Parameterlisten nur mit built-ins funktionieren, also nicht mit Klassen (okay, mit Zeigern klappt es vielleicht).
    Aber man benutzt in C++ keine variablen Parameterlisten, es gibt nämlich viel bessere und vor allem typsichere Methoden.

    btw: Woher weißt du, dass die Funktion nach 5 Sekunden abschmiert? Das erscheint mir etwas weit hergeholt, dass Windows mit der Schutzverletzung 5 Sekunden wartet. Tipp: Geh die Funktion mal im Debugger durch, dann siehst du ganz genau welche Variablen stimmen und welche nicht.



  • Alexandrescus Inline Container scheinen mir dafuer uebrigens praedestiniert zu sein.



  • Diese Inline-Container hab ich aber ned verstanden...

    Ist das jetzt eine extra Klasse oder wie? Ich hab mir das Listing mal angeschaut. Sehr verwirrend, sry. 😞

    MfG



  • Du ladest dir die source runter.

    Und dann schreibst du einfach:

    #include "InlineContainer.h"
    um die Container einzubinden.

    Der rest ist simpel:

    void foo(std::vector<Control> const& edits)
    {
      std::vector<Control>::iterator i=edits.begin();
      std::vector<Control>::iterator end=edits.end();
    
      while(i!=end)
      {
        i->update();
        ++i;
      }
    }
    
    //der aufruf:
    foo(make_vector(hwnd1)(hwnd2)(Control(foo))(someFunction()));
    

    was hast du denn genau nicht verstanden? die templates? die kannst du dir ja wegdenken (siehe mein beispiel) - allerdings darfst du dann halt immer nur make_vector verwenden...



  • btw, @Saiyaman: Bitte ändere nicht laufend das Topic, ohne dazuzuschreiben was es vorher war. So etwas fördert nicht gerade den Wiedererkennungswert.



  • OK. Ich hab das Topic verallgemeinert.

    MfG



  • @Shade of Mine

    Was genau ist dieses "i" ? Ein Zeiger?

    void multiFocus (BITMAP * sur, int editCol, int blitCol, int noOfArgs, std::vector<CEditBox> &edits)
    {
    	BITMAP * temp = create_bitmap (sur->w, sur->h);
    	blit(sur, temp, 0, 0, 0, 0, sur->w, sur->h);
    
    	CEditBox * box[500];
    	int j = 0;
    
    	std::vector<CEditBox>::iterator i   = edits.begin(); 
    	std::vector<CEditBox>::iterator end = edits.end(); 
    
    	while(i!=end)
    		box[j++] = i++;
    };
    

    Zeigt das Box-Array von Pointern jetzt immer auf eine EditBox ?

    Aufruf:

    multiFocus(backBuffer, COLOR_YELLOW, COLOR_WHITE, 3, make_vector(size_xBox)(size_yBox));
    

    MfG



  • Saiyaman schrieb:

    Was genau ist dieses "i" ? Ein Zeiger?

    Ein iterator - siehe deine Lieblingsdoku ueber die STL
    Ein iterator ist aber im Prinzip ein Zeiger (man beachte: im Prinzip)

    Zeigt das Box-Array von Pointern jetzt immer auf eine EditBox ?

    Uebergib dann besser auch nur Zeiger.

    zB:

    typedef std::vector<CEditBox*> EditBoxArray;
    
    void multiFocus (BITMAP * sur, int editCol, int blitCol, int noOfArgs, EditBoxArray const& edits)
    {
        BITMAP * temp = create_bitmap (sur->w, sur->h);
        blit(sur, temp, 0, 0, 0, 0, sur->w, sur->h);
    
        CEditBox * box[500];
        int j = 0;
    
        EditBoxArray::iterator i   = edits.begin(); 
        EditBoxArray::iterator end = edits.end(); 
    
        while(i!=end)
        {
          box[j++] = *i;
          ++i;
        }
    };
    
    //aufruf:
    multiFocus(backBuffer, COLOR_YELLOW, COLOR_WHITE, 3, make_vector(&size_xBox)(&size_yBox));
    


  • i ist ein Iterator. Ein Zeiger ist auch ein Iterator. (Iterator ist sozusagen die Abstraktion)

    Saiyaman schrieb:

    Zeigt das Box-Array von Pointern jetzt immer auf eine EditBox ?

    /edit: Jetzt versteh ich's

    /edit: menno, zu spät...



  • Vielen Dank! Hat alles wunderbar geklappt!

    Ein Hoch auf die "Inline Container" !! Hip, Hip!!

    😃

    MfG


Anmelden zum Antworten