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.