initalizer_list und vector Initialisierung



  • Hallöchen nochmal,
    Hätte da noch eine Frage zu initializer_list.

    Wenn ich folgende Klasse habe:

    class my_class{
      public:
        my_class(const std::initializer_list<my_type &> &il)
        {
          ...
        }
    
      private:
        std::vector<my_type*> data;
    };
    

    Wie bekomme ich jetzt die Zeiger in meinen Vector? Direkt geht ja nicht, da im Vektor Zeiger sind und keine Referenzen.
    Wenn ich eine Shleife benutze, also:

    for(auto datum : il)
        vector.push_back(&datum);
    

    Meckert er, dass er begin() und end() der Initialisierungsliste nicht findet.

    Danke,
    Martin



  • Es muss natürlich data.push_back lauten, und nicht vector.push_back. Daran liegt es aber definitiv nicht. Es scheint etwas mit der Referenz in der Initialisierungsliste zu tun zu haben. Die Schleife hat damit ein Problem. Aber welches?



  • initializer_list ist auch nur ein Container.



  • 314159265358979 schrieb:

    initializer_list ist auch nur ein Container.

    Das war hilfreich

    @Topic könntest du uns auch mal die komplette Fehlermeldung zeigen?



  • Martin Kalbfuß schrieb:

    Hätte da noch eine Frage zu initializer_list.

    class my_class{
      public:
        my_class(const std::initializer_list<my_type &> &il)
        {
          ...
        }
    
      private:
        std::vector<my_type*> data;
    };
    

    Wie bekomme ich jetzt die Zeiger in meinen Vector?

    Sorry, aber das ist einfach Unfug. Viel zu viele & Symbole.

    Die naheliegende Lösung:

    class my_class{
      public:
        my_class(std::initializer_list<my_type*> il)
        : data(il)
        {
          ...
        }
    
      private:
        std::vector<my_type*> data;
    };
    

    'ne "initializer list" sind besteht eh nur aus 2 Zeigern. Da kann man sich die Überpage per ref-auf-const sparen. So machen's auch die Standardcontainer. Und Referenzen kann eine IL sowieso nicht halten.



  • otze schrieb:

    Das war hilfreich

    -->

    314159265358979 schrieb:

    initializer_list ist auch nur ein Container.

    -->

    krümelkacker schrieb:

    Und Referenzen kann eine IL sowieso nicht halten.



  • krümelkackers Kommentar war auch Hilfreich. Leider kam er zeitlich nach dir, sodass du dich nicht darauf berufen kannst.



  • otze schrieb:

    Leider kam er zeitlich nach dir, sodass du dich nicht darauf berufen kannst.

    Tu ich nich. Stell dich nicht dumm.



  • 314159265358979 schrieb:

    otze schrieb:

    Leider kam er zeitlich nach dir, sodass du dich nicht darauf berufen kannst.

    Tu ich nich. Stell dich nicht dumm.

    Verhältst du dich absichtlich immer so scheisse? Mit deinem Kommentar konnte niemand etwas anfangen. Punkt.



  • Schade, dass man keine Referenzen übergeben kann. Gibt's da keine Tricks? Pointer als Übergabetyp sind nicht gerade Stilvoll, auch wenn's technisch keinen Unterschied macht.

    Danke,
    Martin



  • Martin Kalbfuß schrieb:

    Pointer als Übergabetyp sind nicht gerade Stilvoll

    Warum sind Pointer weniger stilvoll als Referenzen? Wegen des Adressoperators?



  • Nexus schrieb:

    Martin Kalbfuß schrieb:

    Pointer als Übergabetyp sind nicht gerade Stilvoll

    Warum sind Pointer weniger stilvoll als Referenzen? Wegen des Adressoperators?

    Naja, wenn du jedesmal auf Gültigkeit prüfen musst (wenn du dereferenzierst) ... :xmas1:



  • std::ref



  • Hacker schrieb:

    Naja, wenn du jedesmal auf Gültigkeit prüfen musst (wenn du dereferenzierst)

    Wer sowas macht, hat ganz andere Probleme...



  • Nexus schrieb:

    Hacker schrieb:

    Naja, wenn du jedesmal auf Gültigkeit prüfen musst (wenn du dereferenzierst)

    Wer sowas macht, hat ganz andere Probleme...

    Was für Probleme denn?

    Wenn es unbedingt Referenzen sein müssen, kann man bestimmt mit variadic templates einen schönen Konstruktor basteln.



  • TyRoXx schrieb:

    Was für Probleme denn?

    Wer Zeiger jeweils vor ihrer Verwendung auf NULL prüft, ist sich über seine Programmsemantik nicht im Klaren.

    Gewisse Zeiger haben einfach gültig zu sein, da ist NULL schlicht und einfach ein Logikfehler. Ein if (ptr) führt nur dazu, dass dieser Logikfehler verschleiert und weitergetragen wird, ausserdem macht es den Code unnötig hässlich. Wenn man nichts schreibt, oder ohne vernünftige Debugger meinetwegen assert(ptr) , wird der Fehler hingegen sofort entdeckt.

    Dran denken, ich hab "gewisse" geschrieben.


Anmelden zum Antworten