Template und Initialisierungsliste
-
Hallo. Ich habe eine Template Vektorklasse
und möchte über die Initialisierungsliste des Konstruktors das Array für die Werte des Vektors erzeugen.#include <iostream> template<class T> class CVektor { private: int _x; public: CVektor() {} CVektor(int x) :_x(x),_vec_array(new T[_x]) {} CVektor(const CVektor<T>& v) :_x(v._x), _vec_array(new T[_x]) { for (int i=0;i<_x;++i) { _vec_array[i]=v._vec_array[i]; } } ~CVektor() { delete[] _vec_array; } int size()const { return _x; } T& operator[](int i)const { if(i<0 || i>=_x) { cerr << "Indexfehler" << endl; } else { return _vec_array[i]; } } void setValue(int x, T wert) { _vec_array[x]=wert; } };
Bekomme aber den Fehler: unzulässige Elementinitialisierung, _vec_array ist weder Element noch Basis
Das ist aber ein Beispiel aus einem Buch, also sollte es doch eigentlich funktionieren
Vielen dank für eure Hilfe
-
Dann ist es blödes Buch...
_vec_array als Member-Variable ist in dieser Klasse wirklich nicht drin.Müsste in etwa lauten:
template<class T> class CVektor { private: int _x; T *_vec_array;
-
Weiters fehlt noch mindestens der Assignment-Operator:
void swap(CVektor& other) { std::swap(_x, other._x); std::swap(_vec_array, other._vec_array); } CVektor& operator = (const CVektor& other) { CVektor temp(other); swap(temp); }
Und ein Vergleichsoperator (operator ==) wäre vermutlich auch nicht verkehrt.
-
Okay, danke für die Hinweise. Es müssen ja auch noch mehr Dinge eingebaut werden. Es war nur erstmal ne Übung für mich, damit ich da besser durchsehe.
Mein Problem ist, ich kann die Klasse jetzt nutzen um INT, DOUBLE, FLOAT Typen unterzubringen, jedoch funktioniert es mit char nicht.
Fehler: Konvertierung von const char[2] in char nicht möglich
In der Funktion setValue
void setValue(int x, T wert) { _vec_array[x]=wert; }
achso der Aufruf in der main-Funktion:
CVektor<char> c(2); c.setValue(0,"a"); c.setValue(1,"b");
-
"a" ist ein string-literal (=array aus chars) und kein einzelnes char.
'a' wäre ein char.
-
hustbaer schrieb:
"a" ist ein string-literal (=array aus chars) und kein einzelnes char.
'a' wäre ein char.wieder was gelernt
dankeschönes geht, na denn mal weiter.
-
Wie kann man denn in ein der Ausgabefunktion auf den Type der Klasse zugreifen, so dass man ihn mit cout ausgeben kann?
-
das geht nur sehr begrenzt
typeid(T).name()
wobei das format was name() zurückliefert implementation-defined ist, also von compiler zu compiler anders ist