Templates (Sehen ,verstehen^^)
-
gut danke leute^^
-
asc schrieb:
Ganz ehrlich: Es gibt auch sinnvolle Regeln, und diese gehört dazu.
sinnvoll? nein, nicht mit fettem "niemals" drin.
sobalds kein dogma mehr ist, geb ich dir recht.ich verwende entweder std oder vlib, aber ich will eigentlich nicht innerhalb eines projekts beide benutzen. da kann ich mir doch ein using namespace std oder using namespace vlib in den zentralen header knallen und dort umschalten.
-
ehm folegndes^^
habs jetzt so:
hpp// dat.hpp #ifndef DAT_HPP_ #define DAT_HPP_ template <class data> class DAT { private: data Var; public: data getData(); bool isEmpty(); void setData(data Wert); }; #include "dat.impl" #endifimpl
// dat.impl //----------> Getter! <----------// data DAT::getData() { return Var; } //----------> Prüfer! <----------// bool DAT::isEmpty() { if (Var == 0) {return true;} else {return false;} } //----------> Setter! <----------// void DAT::setData(data Wert) { Var = Wert; } //----------> TheEnd! <----------//Es gibt immer noch einen compiler fehler, auch wenn ich seh in h umbenene, naja werds wohl gleich in der hpp machen müssen^^
-
getData ist aber nicht in der klasse DAT, sondern in DAT<data>.
das ging glaub ich so:template <class data> data DAT<data>::getData() { return Var; }aber bis auf seltene ausnahmen würde ich mich damit nicht behängen und den code einfach in die klasse kloppen.
-
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.