Vector mit Objekten einer Klasse füllen - ohne Standardkonstruktoraufruf



  • Hi Leute,

    ich möchte einen vector wie diesen Nutzen:

    const int SIZE = 100;
    vector<class Klasse> Vec(SIZE);

    was muss ich abändern um hier nicht den Standardkonstruktor aufzurufen?

    Meine Versuche google zu diesem Thema zu bemühen sind leider allesamt fehlgeschlagen und deshalb bitte ich euch um Hilfe.

    sollten noch mehr Info's zur Problemlösung nötig sein so liefere ich die natürlich bei Bedarf nach.

    Gruß PluMi



  • Meinst du vector::resize?



  • Oder vector::reserve?

    Eins von den beiden sollte das sein was du willst:D


  • Mod

    out schrieb:

    Meinst du vector::resize?

    Ruft den Konstruktor auf.

    @Threadersteller: Wann immer Objekte erzeugt werden, werden sie auch vollständig konstruiert. Und dazu wird dann eben der jeweils gewählte Konstruktor heran gezogen. Wenn du also nichts spezielles angibst, wenn du hier deine 100 Objekte erzeugst (dir ist schon klar, dass da 100 Objekte erzeugt werden? Ist das womöglich gar nicht, was du möchtest?) wird hier daher der Standardkonstruktor dieser Objekte heran gezogen.

    Es gibt aber viele Möglichkeiten, Objekte in einen vector zu bekommen. Ein paar, von denen ich denke, dass sie passen könnten (es gibt noch viele andere):
    -Die üblichste Methode: push_back. Kopiert ein vorher konstruiertes Objekt. Das vorher konstruierte Objekt kannst du erzeugen, wie du willst. Die Kopie benutzt logischerweise den Kopierkonstruktor.
    -emplace_back erzeugt ein Objekt direkt im vector. Man kann den Konstruktor wählen, den man möchte.
    -Der Konstruktor des vectors kann auch ein Vorlageobjekt als zweites Argument nehmen, wenn du tatsächlich gleich 100 Objekte erzeugen möchtest. Das Objekt wird dann 100 mal kopiert.
    -Einer der anderen Konstruktoren des vectors kopiert eine ganze Reihe von Objekten aus einem anderen Container.

    Genaueres kann man sagen, wenn du erklärst, was du stattdessen erreichen möchtest, nicht nur, was du nicht erreichen möchtest.



  • Danke out für den Tipp..
    doch entweder stelle ich mich zu blöd an um vector::reserve anzuwenden oder es funzt nicht. Das Problem ist das ich durch die Zeile

    vector<class Klasse> Vec(SIZE);
    

    den Fehler bekomme:

    error C2512: 'Klasse': Kein geeigneter Standartkonstruktor verfügbar.

    Dabei habe ich nur einen Konstruktor

    Klasse(string, string, int, double);
    

    und das soll auch so bleiben. Mit vector::reserve würde ich das Problem ja erst nach der oben genannten Zeile anpacken.. oder sehe ich das Falsch?



  • Danke SeppJ

    Habe nun leider keine Zeit mehr deinen Text zu interpretieren, auszuprobieren, zu antworten. Werde mich aber heute Abend wenn ich wieder da bin direkt dran setzen.



  • Ich dachte an

    vector<Klasse> Vec; 
    const int SIZE = 100;
    Vec.reserve(SIZE);
    


  • @SeppJ: okay das 100 Objekte erzeugt werden war mir nicht klar. Ich wollte nur Platz für 100 Objekte in dem Vector schaffen.
    - die push_back Methode fällt auf Grund des zusätzlichen Kopierkonstruktors aus. Habe einen Konstruktor und dabei soll es bleiben.
    - die anderen Vorschläge gehen leider über meinen (momentanen) Horizont hinaus...
    Ich denke ich verrate wirklich mal lieber was ich erreichen will.

    const int SIZE = 3;
    vector<class Klasse> Vec(SIZE);
    
    Klasse Kl_1("Peter", "Pan", 2003, 4000);
    Klasse Kl_2(("Volker", "Prim", 2013, 44000);
    Klasse Kl_3("Otto", "Kasimir", 1995, 1500);
    
    Vec.at(0) = Kl_1;
    Vec.at(1) = Kl_2;
    Vec.at(2) = Kl_3;
    

    naja und das ganze mit nur einem Konstruktor der mir die 4 Werte initialisiert.

    @out: habs ausprobiert, bekomme aber leider einen Laufzeitfehler.



  • vector<class Klasse> Vec;
    
    Klasse Kl_1("Peter", "Pan", 2003, 4000);
    Vec.push_back(Kl_1);
    // bzw.
    Vec.emplace_back("Volker", "Prim", 2013, 44000);
    

  • Mod

    PluMi schrieb:

    - die push_back Methode fällt auf Grund des zusätzlichen Kopierkonstruktors aus. Habe einen Konstruktor und dabei soll es bleiben.

    Ich wette, du hast den Kopierkonstruktor nicht deaktiviert (und solltest du höchstwahrscheinlich auch nicht).

    Wahrscheinlich verstehst du obigen Absatz auf deinem Wissensstand gar nicht. Da hilft nur, mit einem guten(!) Buch weiter zu lernen. Jedenfalls präsentierst du gerade eine Menge Halbwissen (nicht nur das obige, aber das ist eines der krasseren Beispiele). Das ist nicht direkt schlimm, aber du solltest erfahren, dass nicht alles, was du derzeit zu wissen glaubst, so richtig ist.



  • PluMi schrieb:

    - die push_back Methode fällt auf Grund des zusätzlichen Kopierkonstruktors aus. Habe einen Konstruktor und dabei soll es bleiben.

    Dann nimm emplace_back statt dessen.
    Du kannst auf jeden Fall nicht auf Objekte zugreifen die du nicht erstellt hast. Und wenn du weder Default-Ctor noch Copy-Ctor hast, dann ist die einzige Möglichkeit Objekte in einem vector zu erstellen eben emplace_back .

    ps: Wenn du den Zuweisungsoperator nicht sperrst, wieso sperrst du dann den Copy-Ctor?
    WTF?


  • Mod

    hustbaer schrieb:

    ps: Wenn du den Zuweisungsoperator nicht sperrst, wieso sperrst du dann den Copy-Ctor?
    WTF?

    Anfänger. Sei nicht verwirrt. Er weiß nur nicht genau, was er da gerade gesagt hat.

    @PluMi: Du siehst, wie verwirrend einige deiner Äußerungen sind, wenn man sie wortwörtlich nimmt 🙂 .



  • @SeppJ: Du hast ziemlich Recht mit meinem gefährlichen Halbwissen 😉 Nun weiß ich aber wo ich ansetzen muss.. jetzt muss ich nur noch die Zeit finden es mir anzueignen 😃

    @Caligulaminus: 100 Punkte! Genau das löst mein Problem! Versteh nur noch nicht warum ein Vector mit SIZE- Angabe einen Standardkonstruktor braucht und einer ohne keinen 😕


  • Mod

    Versteh nur noch nicht warum ein Vector mit SIZE- Angabe einen Standardkonstruktor braucht und einer ohne keinen

    Weil ein vector mit SIZE bElementen diese alle doch erzeugen muss. Wie sonst als mit dem Default-Konstruktor?



  • [haarklaub]
    Naja bei C++98 macht er nur eins mit dem Default-Ctor, und kopiert das dann SIZE mal 🤡
    [/haarklaub]


  • Mod

    hustbaer schrieb:

    [haarklaub]
    Naja bei C++98 macht er nur eins mit dem Default-Ctor, und kopiert das dann SIZE mal 🤡
    [/haarklaub]

    Interessant, diesen Unterschied zwischen C++98 und C++11 kannte ich noch gar nicht.

    * merk für zukünftige Klugscheißereien *

    Den haben sie nicht an die große Glocke gehängt. Bist du beim Lesen des Standards selber darüber gestolpert? Oder gibt's irgendwo eine Sammlung solcher Miniunterschiede?


  • Mod

    @SeppJ: Es rührt von der riesisgen Default-Argument Scheiße bei C++03. Schau dir mal die Konstruktoren in (2) und (3) im Vergleich an, dann merkst du es sofort.



  • @SeppJ
    Ich wusste dass es in C++98 so war. War in irgend einem Fred hier im Forum mal Thema.
    Dass es in C++11 geändert wurde wusste ich nicht. Hab' aber nachgesehen, weil ich schon so nen Verdacht hatte dass Arcoth Recht haben könnte 🙂


Anmelden zum Antworten