Template Klasse Stack realisiert mit stl Klasse vector
-
Der folgende Stack funktioniert nicht. Ich glaube es liegt irgendwie an den Templates. Seht Ihr einen Syntaxfehler?
template <class T> class CStack { public: typedef vector <T> Container; typedef Container::iterator Iterator; Container v1; Iterator j; CStack(int size) { vector <T> V (size); } ~CStack() {} void push(T wert) { v1.push_back(wert); } void pop() { v1.pop_back(); } void ausgabe() { for (int k = 0; k < v1.size(); k++) cout << v1[k] << endl; cout << endl; } void top() { if ( 0 == v1.empty() ) { for(j=v1.begin(); j != v1.end()-1; j++); cout << "Inhalt des obersten Elements: " << *j << endl; } else cout << "Der Stack ist leer." << endl; cout << endl; } int empty() { if ( 0 == v1.empty() ) return 0; else return 1; } };
-
Syntaxfehler erkennt der Compiler.
-
Debugger. schrieb:
Syntaxfehler erkennt der Compiler.
also semantik fehler oder was soll ich jetzt dazu sagen?

-
Debugger. schrieb:
Syntaxfehler erkennt der Compiler.
Bei Templateklassen aber erst wenn die Klasse instanziert wird!
Gruß
-
"funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.
-
Hallo,
Für top würde wohl das hier reichen
void top() { if ( !v1.empty() ) { cout << "Inhalt des obersten Elements: " << vl.back() << endl; } else cout << "Der Stack ist leer." << endl; cout << endl; }Allerdings sollte top bei einem Stack das oberste Element eher zurückgeben.
Auch bei empty reicht einreturn vl.empty();(empty sollte bool sein).
-
template <class T> class CStack { public: typedef vector <T> Container; typedef Container::iterator Iterator; Container v1; Iterator j; CStack(int size) { vector <T> V (size); } }Bei diesem Teil bin ich mir nicht sicher ob die Syntax richtig ist. Der Stack soll auchg für Strings funktionieren.
-
Der Konstruktor sieht auf jeden Fall falsch (bzw. nutzlos) aus - du erzeugst einen neuen Vektor mit 'size' Elementen, der sofort wieder freigegeben wird.
-
shurik'n schrieb:
template <class T> class CStack { public: typedef vector <T> Container; typedef Container::iterator Iterator; Container v1; Iterator j; CStack(int size) { vector <T> V (size); } }Bei diesem Teil bin ich mir nicht sicher ob die Syntax richtig ist. Der Stack soll auchg für Strings funktionieren.
Syntax ist nahezu richtig, Semantik komplett im Eimer.
template <class T> class CStack { public: typedef vector <T> Container; typedef typename Container::iterator Iterator; // <--- Container v1; Iterator j; //CStack(int size) //{ // vector <T> V (size); // <--- unsinn //} // Variante 1 erstellt einen Stack mit size Elementen; // int size funktioniert prinzipiell auch, ein unsigned // Typ ist aber wesentlich logischer. CStack( std::size_t size ) : v1(size) { } // Variante 2 erstellt einen leeren Stack, sichert aber schon mal // Speicherplatz für size Elemente CStack( std::size_t size ) { v1.reserve(size); } }
-
Die beiden Member, also den Container und den Iterator solltest du in private packen. Dann kann dir niemand mit so Scherzen wie stack.j = irgendeinContainer.begin() dazwischenfunken. Also:
template <class T> class CStack { public: //wenn du willst, dass man CStack::Container machen kann musst du die Typedefs public lassen typedef vector <T> Container; typedef Container::iterator Iterator; private: Container v1; Iterator j; public: //Methoden usw... }