In Templatekonstruktor Objekte erstellen



  • Noch eine Andere Frage: Ich möchte hier im Konstruktur eine mit n angegebene Anzahl an Objekten in meinen vector pushen. Der Typ von T ist jedoch natürlich zu diesem Zeitpunkt unbekannt. Wie kann man das Problem umgehen?

    template<class T> class MyTemplate{
      public:
        MyTemplate(int n);
    
      private:
        std::vector<T*> objs;
    };
    
    MyTemplate<class T>::MyTemplate(int n)
    {
      while(--n)
        objs.push_back(new T());  //Fehler...
    }
    


  • Das ist so auf den ersten Blick erstmal garkein Fehler oder Problem. Du stellst aber eine Anforderung an den Typ T, und zwar dass er einen Default-Konstruktor besitzt.

    while(--n)
    wird übrigens schön schiefgehen, wenn n <= 0 ist.

    Edit:
    Du musst vor die Konstruktordefinition aber nochmal template <class T> schreiben und aus dem <class T> nur ein <T> machen.

    Deutsch ist schon ne ziemlich schwere Sprache 😃 (Anzahl meiner Edits...)



  • Erstmal vielen Dank, aber ich habe das dumpfe gefühl, dass ich nicht raffe, was du meinst. Könntest du ein kleines Beispiel zeigen?



  • template <class T>ShufflePlayer<T>::ShufflePlayer(int nsongs)
    

    *erleuchtung* thx



  • Zu früh gefreut: Wenn ich jedoch

    objs.push_back(new T(2,3)));
    

    schreibe, da der Konstruktor meiner an das Template übergebenen Klasse MyClass zwei Parameter benötigt, bekomme ich wieder Fehlermeldungen!

    [C++ Error] main.cpp(48): E2034 Cannot convert 'int' to 'MyClass *'
    


  • Mir scheint es, als wenn dein Templateparameter MyClass*, und nicht MyClass ist.



  • Mir scheint es, als wenn dein Templateparameter MyClass*, und nicht MyClass ist.

    👍 Recht hast du! Und das soll er auch bleiben. Wie umgehe ich das Problem hier?



  • Warum sollte er?

    Naja wenn T ein MyClass* ist, dann legt new T auch ein MyClass* an und kein MyClass. Dein Vektor speichert zum Beispiel dann auch MyClass**. Willst Du das?? Ich glaube nicht. Deshalb -> aus MyClass* MyClass machen. Wenn Du das Template auch noch anderweitig brauchst, spezialiser es für Pointer.


Anmelden zum Antworten