Templates (Sehen ,verstehen^^)
-
ich habs jetzt aber in eine header gemacht so wie ich es vorhin geschrieben habe und es ging ohne das <data>.
-
Wikinger75 schrieb:
muss die datei ".impl" heißen oder kann die auch anders heißen?
Kann auch anders heissen. Neben .hpp und .h sieht man oft auch .inl, .ipp oder .impl. Ich bevorzuge persönlich .inl (für Inline), da hat MSVC gerade einen eigenen Datentyp.
volkard schrieb:
aber bis auf seltene ausnahmen würde ich mich damit nicht behängen und den code einfach in die klasse kloppen.
Naja, ist auch ein wenig Geschmackssache. Ich mach oft eine Trennung, damit ich Schnittstelle und Implementierung sauber separiert habe. Auch wenn das manchmal auf komplizierte Funktionsdefinitionen herausläuft, gerade wenn noch ein
typedefdabei ist...
P.S. Getter sollte man
constmachen, da man nichts an der Klasse verändert und somit die Memberfunktion auch mit konstanten Instanzen aufrufen kann.
-
// DAT.hpp #ifndef DAT_HPP_ #define DAT_HPP_ template <class DATA> class DAT { private: DATA Var; public: DATA getData() const; bool isEmpty(); void setData(data Wert); }; //----------> Getter! <----------// DATA DAT<DATA>::getData() const { return Var; } //----------> Prüfer! <----------// bool DAT<DATA>::isEmpty() { if (Var == 0) {return true;} else {return false;} } //----------> Setter! <----------// void DAT<DATA>::setData(data Wert) { Var = Wert; } //----------> TheEnd! <----------// #endifEs ist in einer Datei und es funktioniert nicht.
-
Wikinger75 schrieb:
Es ist in einer Datei und es funktioniert nicht.
Das ist keine Fehlerbeschreibung!
-
Wikinger75 schrieb:
// DAT.hpp #ifndef DAT_HPP_ #define DAT_HPP_ template <class DATA> class DAT { private: DATA Var; public: DATA getData() const; bool isEmpty(); void setData(data Wert); }; //----------> Getter! <----------// DATA DAT<DATA>::getData() const { return Var; } //----------> Prüfer! <----------// bool DAT<DATA>::isEmpty() { if (Var == 0) {return true;} else {return false;} } //----------> Setter! <----------// void DAT<DATA>::setData(data Wert) { Var = Wert; } //----------> TheEnd! <----------// #endifEs ist in einer Datei und es funktioniert nicht.
// DAT.hpp #ifndef DAT_HPP_ #define DAT_HPP_ template <class DATA> class DAT { private: DATA Var; public: DATA getData() const; bool isEmpty(); void setData(data Wert); }; //----------> Getter! <----------// template <class DATA> DATA DAT<DATA>::getData() const { return Var; } //----------> Prüfer! <----------// template <class DATA> bool DAT<DATA>::isEmpty() { if (Var == 0) {return true;} else {return false;} } //----------> Setter! <----------// template <class DATA> void DAT<DATA>::setData(data Wert) { Var = Wert; } //----------> TheEnd! <----------// #endifDir fehlt der Template"bezeichner" (ich nenns einfach mal so:D)
-
Lol, ich wusste nicht das man auch auserhalb der klasse das template einfügen muss^^. Jetzt funktionierts entgültig.
Thx.
-
Wikinger75 schrieb:
Lol, ich wusste nicht das man auch auserhalb der klasse das template einfügen muss^^. Jetzt funktionierts entgültig.
Thx.Ja, klar. Der Compiler kann da sonst nicht wissen, was DATA sein soll. Darum musst du es ihm explizit sagen, dass es ein Templateparameter ist. Das entfällt, wenn du die Definition innerhalb der Klasse machst, da du den Parameter bereits spezifiziert hast.