vererbte TemplateKlasse mit string element
-
Hallo, ich muß zwecks Prüfungsvorbereitung ein Programm umändern.
Das Grundprogramm ist relativ einfach. über eine abgeleitete template Klasse fülle ich ein Array und gebe es zum einen aus ohne Bereichs Check und mit einer anderen
Methode mache ich einen Bereichs Check.
Nun will ich aber diesen Vergleich mit einem String erweitern, da setzt es total aus bei mir...#include <iostream>
#include <exception>
#include <string>
using namespace std;template <class T, const unsigned int size, const string > class Array
{
protected:
T arr[size];
string name;
public:
// T &operator[](unsigned int index) { return arr[index]; }T &at(unsigned int index, string m)
{
name =m;
try
{if (index < size && m=="karl")
return arr[size];
else
throw std::domain_error("invalid index");
}
catch (exception &exc)
{
cout << exc.what() <<endl;
}
}
};////////////////////////////////////////////////////////////////////////
// ABGELEITETE TEMPLATEKLASSEtemplate <class T, const unsigned int size ,const string > class ArrayPlus : public Array<T, size, string>
{
private:
public:
ArrayPlus(const T &initval, string m) //Array füllen
{
for (int i = 0; i < size; i++)arr[i] = (initval +"name");
}};
int main(void)
{
ArrayPlus<char, 3, string> ap(15.1,"Hans"); //double-> zahlenform;3->für arraysize + initialisierung 1.1ap[1] = 2.2,"hans";
cout << ap[0] << endl;
cout << ap[1] << endl;
cout << ap[2] << endl;
cout << ap.at(2) << endl;cout << ap[3] << endl; // Zufallswert, kein range-check!
cout << ap.at(3) << endl; // Abbruch mit out_of_range Exception!
Also so funktioniert es mal gar nicht... ich habe leider wenig übung mit der Klasse String und weis nicht mehr weiter.
kann man das in dieser Form Überhaupt machen
wäre super nett wenn mir mal jemand ein Paar tipps geben könnte.
-
Schon 22 Beiträge und noch keine Code-Tags bemerkt?
-
oh.. eigentlich nicht. aber jetzt weiß ich es.
-
Erstens: die Angabe 'const string' als Template-Parameter sieht irgendwie illegal aus - bist du sicher, daß das funktioniert?
Zweitens: In der Anweisung
ap[1]=2.2,"Hans";hat der Teil hinter dem Komma keinerlei Auswirkung.Drittens: Du kannst keine double und Strings miteinander addieren.
-> Das Programm sieht zwar aus wie C++, aber ich bezweifle, daß es so überhaupt compiliert werden kann.
PS: Und viertens: sfds
-
mark79 schrieb:
oh.. eigentlich nicht. aber jetzt weiß ich es.
Dann füge sie doch bitte in deinen Beitrag ein.
-
#include <iostream> #include <exception> #include <string> using namespace std; template <class T, const unsigned int size, const string > class Array { protected: T arr[size]; string name; public: // T &operator[](unsigned int index) { return arr[index]; } T &at(unsigned int index, string m) { name =m; try { if (index < size && m=="karl") return arr[size]; else throw std::domain_error("invalid index"); } catch (exception &exc) { cout << exc.what() <<endl; } } }; //////////////////////////////////////////////////////////////////////// // ABGELEITETE TEMPLATEKLASSE template <class T, const unsigned int size ,const string > class ArrayPlus : public Array<T, size, string> { private: public: ArrayPlus(const T &initval, string m) //Array füllen { for (int i = 0; i < size; i++) arr[i] = (initval +"name"); } }; int main(void) { ArrayPlus<char, 3, string> ap(15.1,"Hans"); //double-> zahlenform;3->für arraysize + initialisierung 1.1 ap[1] = 2.2,"hans"; cout << ap[0] << endl; cout << ap[1] << endl; cout << ap[2] << endl; cout << ap.at(2) << endl; cout << ap[3] << endl; // Zufallswert, kein range-check! cout << ap.at(3) << endl; // Abbruch mit out_of_range Exception!Das wäre auch meine frage...const string als template Parameter???
-
mark79 schrieb:
Das wäre auch meine frage...const string als template Parameter???
Das hast du doch geschrieben. Also solltest du auch wissen, was es darstellen soll.
Wie gesagt - nach meinem Kenntnisstand ist das nicht erlaubt. Du darfst als Template-Parameter nur 'Werte' angeben, die der Compiler bereits auswerten kann, das umfasst Datentypen (typename), Ganzzahl-Compilezeitkonstanten und Adressen von statisch gebundenen Variablen.Also nochmal: Geht das Programm wirklich so durch den Compiler? Wenn ja, durch welchen?
-
Habe doch geschrieben, dass es so nicht funktioniert...Also nicht durch den Compiler geht.
-
Dann erklär nochmal, was du genau vorhast mit dem Programm? Die meisten Stammgäste kennen sich gut genug mit c++ aus, um dir bei konkreten Problemen weiterhelfen zu können, aber aus so einem Programmschnipsel und der Erklärung "das klappt nicht" kann niemand etwas machen.
-
OK, ist wirklich ungenügend ausgedrückt.
Ich wollte im prinzip über meine template Klasse nicht nur mein Array füllen sondern auch noch über die initialisierung ein String übergeben....
Also mein Programm ist wirklich Schrott.ArrayPlus<char, 3, string> ap(15.1,"Hans");hier wollte ich mein Array mit 15.1 initialisieren und gleichzeitig so als
"index" Hans übergeben.
Aber ich glaube ich muß das ganze noch mal grundlegend überdenken!
aber trotzdem danke.
werde mich bemühen beim nächsten mal klarere Fragen zu stellen.
-
mark79 schrieb:
Also mein Programm ist wirklich Schrott.
Gut erkannt
Wenn du einen Stringwert zur Initialisierung mitgeben willst, mußt du den nicht als Template-Parameter eintragen, sondern nur im Ctor angeben und füllen:template<typename T,int size> class Array { T vals[size]; public: Array(const T& val) { for(int i=0;i<size;++i) vals[i]=val; } ... }; template<typename T,int size> class ArrayPlus : public Array<T,size> { string name; public: ArrayPlus(const T& val,const string& n) : Array(val), name(n) {} ... };(abgesehen davon - in ein Array<char,...> wirst du nur schwer double-Werte reinpacken können)
-
Ja, verstehe was du meinst.
Also ich werd das wohl Programm mal sanieren.
Danke