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 ein

    return 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...
    }
    

Anmelden zum Antworten