Konstruktor und Array



  • Hallo,

    ich habe einen Konstruktor, zB. Test(string name).

    Jetzt möchte ich davon eine Array anlegen.

    Test *test = new Test[5];

    Mein Problem ist das ja kein Standardkonstruktor verfügbar ist.

    Wie kann ich für das Feld den Platz reservieren aber trotzdem keinen string name festlegen?



  • Hallo

    In C++ am besten so

    #include <vector>
    ...
    std::vector<Test> array(5, "Hallo");
    

    oder du gibst dem Konstruktor-Parameter noch einen Default Value

    Test(string name = "")
    

    bis bald
    akari



  • Array mit rohem Speicher erstellen und über placement new die Objekte erstellen.

    char array[sizeof(T)*x];
    T* arr=(T*)array;
    for(int i=0;i<x;++i) {
      new(arr+i)(value);
    }
    

    so in etwa aus dem gedächtnis gehackt...


  • Mod

    Shade Of Mine schrieb:

    Array mit rohem Speicher erstellen und über placement new die Objekte erstellen.

    char array[sizeof(T)*x];
    T* arr=(T*)array;
    for(int i=0;i<x;++i) {
      new(arr+i)(value);
    }
    

    so in etwa aus dem gedächtnis gehackt...

    Hier (bei statischen oder automatischen Variablen - bei new char[..] ist das kein Problem) muss allerdings auf Alignment geachtet werden.

    boost::aligned_storage<sizeof(T)*x,boost:: alignment_of<T> > array;
    T* arr=(T*)array;
    for(int i=0;i<x;++i) {
      new(arr+i)(value);
    }
    

    Ich habe allerdings Zweifel, dass das eine geeignete Lösung ist. std::vector liegt näher.



  • C++ Neuling schrieb:

    ich habe einen Konstruktor, zB. Test(string name).

    2 kleine Anmerkungen die jetzt nichts mit der Frage zu tun haben, aber sich anhand deines Konstruktorbeispieles herleiten lassen:

    1. Niemals using namespace in einem Header verwenden!
    2. Objekte nicht "per Value" übergeben, sondern als konstante Referenz

    Sprich statt ...
    Test(string name);
    ... sollte es ...
    Test(const std::string& name);
    ... lauten.



  • Danke für die Hilfe, habe das Problem mit einem Vector gelöst.


Anmelden zum Antworten