Template Klasse



  • #ifndef MEINSTACK_H
    #define MEINSTACK_H
    #include <cassert>
    #include <vector>
    using namespace std;
    // Template Klasse
    template<typename T, unsigned int MaximalWert>
    class SimpleStack{
    public:
    	bool emtpy() const { return anzahl == 0; }
    	void clear() { anzahl = 0; }
    	void hinzufuegen(const T& );
    	void entfernen();
    	const T& top() const;
    	int getMAX() const { return max; }
    	int getBelegteAnzahl() const { return anzahl; }
    private:
    	unsigned int anzahl{ 0 };
    	vector<T> StackArray(MaximalWert);
    };
    // Typdefintionen SimpleStack
    template<typename T, unsigned int m>
    void SimpleStack<T, m>::hinzufuegen(const T& c){
    	StackArray.at([anzahl++]) = c;
    }
    template<typename T, unsigned int m>
    void SimpleStack<T, m>::entfernen(){
    	assert(!empty());
    	--anzahl;
    }
    // Letztes Element des Arrays lesen
    template<typename T, unsigned int m>
    const T& SimpleStack<T, m>::top()const {
    	return StackArray[anzahl-1];
    }
    
    #endif
    

    Fehler:
    Fehler 1 error C2061: Syntaxfehler: Bezeichner 'MaximalWert' c:\users\programmieren\documents\visual studio 2013\projects\projekt2\projekt2\meinstack.h 19 1 Projekt2

    Ich sehe den Fehler nicht könnt ihr mir vllt. weiterhelfen?



  • Du musst die Werte im Konstruktor initialisieren:

    SimpleStack()   : anzahl(0), StackArray(MaximalWert) {}
    


  • Beispiel:
    SimpleStack<int, 67> Stack1;

    So würde ich ein Objekt erzeugen dabei wird der default konstruktor aufgerufen
    In der Klasse habe ich anzahl mit 0 initalisiert (sobald ein objekt erzeugt wird werden die werte ja zugewiesen)
    und 67 wird da doch eigentlich dem vector automatisch zugewiesen oder nicht? 😕

    Ich habs auch schon mit dem Konstruktor versucht der Fehler bleibt trotzdem erhalten 😕


  • Mod

    StackArray.at([anzahl++]) = c;
    

    Soll das wirklich ein Lambdaausdruck sein?

    unsigned int anzahl{ 0 };
    vector<T> StackArray (MaximalWert);
    

    Was ist an diesen beiden Zeilen unterschiedlich, was dafür sorgen könnte, dass das eine richtig und das andere falsch ist? Bonusfrage: Was interpretiert der Compiler in die zweite Zeile hinein?
    Wichtige Zusatzfrage zu eventuellen Korrekturen: Mit welcher Syntax wird welcher Konstruktor des vectors aufgerufen?

    assert(!empty());
    

    Hier wird es auch zu Problemen kommen, da aufgrund der arkanen Regeln von Templates nicht klar ist, um welches empty es sich handelt. Du musst explizit sagen, dass es um das empty deiner Klasse geht.



  • ich antworte darauf sobald ich es raushabe 😃
    du kannst mich ja dann gerne erneut korrigieren falls es falsch sein sollte 😕



  • #include <iostream>
    #include <vector>
    using namespace std;
    
    template<typename T, unsigned int MaximalWert> 
    class SimpleStack{ 
    public:
        SimpleStack<T,MaximalWert>() {
        anzahl = 0;
        vector<T>Stackarray(MaximalWert);
    } 
        bool empty() const { return anzahl == 0; } 
        void clear() { anzahl = 0; } 
        void hinzufuegen(const T& ); 
        void entfernen(); 
        const T& top() const; 
        int getMAX() const { return max; } 
        int getBelegteAnzahl() const { return anzahl; } 
    private: 
        unsigned int anzahl; 
        vector<T> StackArray; 
    }; 
    // Typdefintionen SimpleStack 
    template<typename T, unsigned int m> 
    void SimpleStack<T, m>::hinzufuegen(const T& c){ 
        StackArray.at(anzahl++) = c; 
    } 
    template<typename T, unsigned int m> 
    void SimpleStack<T, m>::entfernen(){ 
        assert(!empty()); 
        --anzahl; 
    } 
    // Letztes Element des Arrays lesen 
    template<typename T, unsigned int m> 
    const T& SimpleStack<T, m>::top()const { 
        return StackArray[anzahl-1]; 
    } 
    int main() {
    	// your code goes here
    	return 0;
    }
    

    Habs voll vergessen sorry.

    Kann ich meinen Code irgendwie noch verbessern?


  • Mod

    Aoki_s schrieb:

    Kann ich meinen Code irgendwie noch verbessern?

    Was heißt hier verbessern? Der ist schlicht falsch, da du wieder mal "Programmieren durch Ausprobieren" praktiziert hast. So lange zufällig Zeichen einfügen bis etwas compiliert, hat mit Programmieren nix zu tun.


Anmelden zum Antworten