Grundsatzfrage: Template von Pointer oder Instanz
-
Hallo,
Ich habe eine Klasse geschrieben fuer Objekte, die ich in einen Vector legen moechte, allerdings ohne einen Default Ctor zu definieren. (Der Vector ist ein QVector, aus der Qt, er sollte sich jedoch wie der STL Vector verhalten; QPair ebenfalls).
class TestElement : public QPair<QString, QString> { mutable qreal dDelay; Element* const pElement; public: // TestElement(){ first = ""; second = ""; pElement = 0; dDelay = 0.0; }; // Die Initialisierung von pElement hier waere schwachsinnig! TestElement(const QString& sz1, const QString& sz2, Element* element) : dDelay(0.0), pElement(element){first = sz1; second = sz2;}; // Ach ja, und warum kann ich "first" und "second" aus der Basisklasse QPair // nicht auch gleich in der Deklarationszeile des ctor initialisieren??? //...Ich hatte den Vector zunaechst als
QVector< TestElement >angelegt. Darauf bekam ich immer eine Fehlermeldung aus einer internen qvector.h, dass ein Default Ctor fuer "TestElement" fehlt.
Als ich den Vector dann folgendermassen definierte verschwand das Problem:QVector< TestElement* >Woran liegt das, brauch ich fuer Klassen die ich in C++ als Template verwenden will auch immer einen Default Constructor, es sei denn ich lege sie als Pointer-Template an?
-
nein. Aber Objekte die in einem stl-container gespeichert werden, müssen einen standard-konstruktor haben.
Sonst könnte zB
vector::resize() nicht funktionieren, der compiler weiß ja nicht, wie er die objekte erstellen soll.Wenn du jetzt einen pointer da rein machst, dann gehts, weil es einen stadard-konstruktor für pointer gibt.
-
Ich dachte mir soetwas aehnliches schon, war mir aber nicht sicher und wollte das nochmal von wem anders hoeren.
Zu dem anderen Punkt, kann ich mit der Schreibweise:
ctor(): a(A), b(B){};denn a und b nicht initialisieren, wenn a und b aus der Basisklasse stammen (obwohl public)?
Danke fuer die Antwort!
-
Fabeltier schrieb:
Ich dachte mir soetwas aehnliches schon, war mir aber nicht sicher und wollte das nochmal von wem anders hoeren.
Zu dem anderen Punkt, kann ich mit der Schreibweise:
ctor(): a(A), b(B){};denn a und b nicht initialisieren, wenn a und b aus der Basisklasse stammen (obwohl public)?
Danke fuer die Antwort!
Nein, dafür ist der Konsktrutor der Basisklasse da.
-
Ok, danke!
