Templates
-
Hallo !
ich bin nicht grad ein großartiger Programmiere und will auch keiner werden
Ich sollte aber bis in einigen Tagen ein Beispiel in C++ über Templates lösen und wollte mal fragen ob mit irgendwer sagen kann worums da geht und was das eigentlich ist ?
Folgende Angabe wurde mir zur Verfügung gestellt:
Schreiben Sie eine C++-Template-Klasse newVector, die einen dynamischen Vektor mit parametrisierbaren Datentyp implementiert und eine herkömmliche Vektoraddition zweier Vektoren mit gleicher Dimension erm¨oglicht. Sollten die Dimensionen der Vektoren bei der Addition nicht übereinstimmen, dann soll die Additionsfunktion eine entsprechende const char* Execption werfen. Ihre Klasse sollte nahtlos in das folgende Testprogramm passen:
int main() { newVector<int> a(3), b(3), d; for (int i=0; i<3; i++) a[i] = b[i] = i; d = a + b; for (int i=0; i<3; i++) cout <<" "<<d[i]; cout <<endl; }
Vielleicht erbarmt sich ja einer am Tag des Herrn und gibt mir ein paar Tipps
lG
Richard
-
also:
weißt du wie man überhaupt templates einsetzt?
bei einem template macht man das nun so:
template<class T, int elemente> //gibt an, welcher datentyp verwendet wird... das ist auch das, was man in dem beispiel in den <> klammern angibt... class newVector { private: T array [elemente]; public: //Konstuktor, Destruktor, getter und setter und die ganzen operatoren... }
die public sachen musst du schon selber machen...
es ist noch nicht ganz das, was du suchst, da man dem template 2 argumente übergeben muss, aber es sollte dir weiter helfen....
-
template<typename T> class newVector { std::vector<T> vec; public: newVector(std::size_t n) : vec(n) {} ... };
Der Rest bleibt dir überlassen
.
-
@MaSTaH:
ich glaube, dass sie vector nicht benutzen dürfen....sie sollen sowas ähnliches selber programmieren, ansonsten wäre das ja zueinfach...
ich habe aber ein problem:
//das problem war so trivial und ich habe so einen müll geschrieben, dass das ja kein anderer sehen darf
-
leech schrieb:
@MaSTaH:
ich glaube, dass sie vector nicht benutzen dürfen....sie sollen sowas ähnliches selber programmieren, ansonsten wäre das ja zueinfach...
Warum nicht? Das macht die Sache doch nicht viel einfacher, außer dass man sich nicht selber mit dynamischem Speicher rumschlagen muss.
wie kann ich das lösen? fällt mir gerade nicht ein...
Wie man dynamisch Speicher anfordert weißt du aber?
-
jaja das weiß ich...
aber mir fällt trotzdem nicht ein, wie man dass dann lösen kann...
//edit:
habs... hatte nen brett vorm kopf...
-
Obwohl hier einige Beispiel aufgeührt sind, weiß ich nicht wie genau ich templates anwende, bzw wie und wo sich der Code genau ändert.
class AddInt{
public:
int Add(int a, int b){
return a+b;
}
};int main(){
AddInt* a=new AddInt;
cout<<a->Add(5,8)<<endl;
return 0;
}Ersetze ich nun AddInt oder int?
-
class AddInt{
public:
int Add(int a, int b){
return a+b;
}
};int main(){
AddInt* a=new AddInt;
cout<<a->Add(5,8)<<endl;
return 0;
}Ersetze ich nun AddInt oder int?
template <class T> class Add { public: T add(T a, T b) { return a + b; } }; int main() { Add<int>* a = new Add<int>; std::cout << a->add(5, 8); delete a; // EDIT, speicher soll ja wieder freigegeben werden :rolling_eyes: }
-
kommt davon, wenn man statt dem "Editieren"-Link den "Zitieren"-Link anklickt..
-
Templates sind "nur" einfache Platzhalter
Nehmen wir mal an, du hast eine Klasse zum Speicher von einem int. class Speicher { public: Speicher(int wert); ~Speicher(); const int getWert() const; void setWert(int); private: int _wert; }; Speicher::Speicher(int wert) : _wert(wert) {} Speicher::~Speicher() {} const int Speicher::getWert() { return _wert; } void Speicher::setWert(int wert) { _wert = wert; }
Willst du diesen Speicher jetzt für longs, oder strings oder oder haben, so musst du ihn neu schreiben.
Oder du machst es mit Templates// Jetzt muss aber alles in die selbe Datei. template <class T> class Speicher { public: Speicher(T wert); ~Speicher(); const T getWert() const; void setWert(T); private: T _wert; }; Speicher::Speicher(T wert) : _wert(wert) {} Speicher::~Speicher() {} const T Speicher::getWert() { return _wert; } void Speicher::setWert(T wert) { _wert = wert; } // Und jetzt kannst du es so nutzen: int main() { Speicher<int> intBox(4); Speicher<size_t> size_tBox(44); Speicher<string> stringBox("44"); return 0; }
So ich hoffe ich hab keine Fehler gemacht!
-
Danke, ich glaub ich habs jetzt endlich gerafft