stl queue kapseln



  • Hi,

    ich möchte zur Übung die Klasse queue aus der stl kapseln.
    Meine klasse queue_s soll also genau das selbe machen wie die Klasse queue.

    Mein Code sieht bisher so aus:

    #include <queue>
    
    template <typename T>
    class queue_s
    {
    public:
    	queue_s(T t):t1(t){}
    	bool empty()
    	{
    		return t1_.empty();
    	}
    	unsigned int size() 
    	{
    		return t1.size();
    	}
    	T front() 
    	{
    		return t1.front();
    	}
    	T back() {
    		return t1.back();
    	}
    	void push(T t) 
    	{
    		t1.push(t);
    	}
    	void pop() 
    	{
    		t1.pop();
    	}
    
    private:
    	queue<T> t1;
    };
    

    Leider gibt es einige Fehler, die sich alle auf die private Membervariable beziehen:
    error C2143: Syntaxfehler: Es fehlt ';' vor '<'
    error C4430: Fehlender Typspezifizierer - int wird angenommen.
    error C2238: Unerwartete(s) Token vor ';'

    Was muß ich ändern damit es funktioniert?



  • std::queue<T> t1;
    


  • Du arbeitest hier öfters mit Kopien statt, wie das Original, mit Referenzen.



  • Schau dir nochmal Zeile 10 an.



  • Hi, dank eurer Hilfe habe ich schon eine lauffähige Version hinbekommen:

    #include <queue>
    
    template <class T> class queue_s
    {
    public:
    	queue_s(T t):t1(t){}
    	queue_s(){}
    
    	bool empty()
    	{
    		return t1.empty();
    	}
    	unsigned int size() 
    	{
    		return t1.size();
    	}
    	T front() 
    	{
    		return t1.front();
    	}
    	T back() {
    		return t1.back();
    	}
    	void push(T t) 
    	{
    		t1.push(t);
    	}
    	void pop() 
    	{
    		t1.pop();
    	}
    
    private:
    	std::queue<T> t1;
    };
    

    Danke für den Hinweis zu meinem Flüchtigkeitsfehler in Zeile 10

    Wenn ich nun versuche den Hinweis von Ethon umzusetzen:

    void push(T &t) 
    	{
    		t1.push(t);
    	}
    

    bekomme ich bei der Verwendung meiner Klasse

    queue_s<int> q;
     q.push(7);
    

    error C2664: 'queue_s<T>::push': Konvertierung des Parameters 1 von 'int' in 'int &' nicht möglich

    Wie kann ich bei der Verwendung von Templates Referenzen verwenden



  • Referenzen auf Literale müssen const sein. Damit mein ich nicht die Referenz ansich (ist ohnehin immer const) sondern das referenzierte Objekt.

    void push(const T &t)
        {
            t1.push(t);
        }
    

    @Ethon: erster 😃



  • Das machst du mit einer konstanten Referenz 🙂
    Ansonsten könntest du ja den Wert 7 ändern, der ja nicht direkt als Wert existiert. Kein Wunder dass der Compiler das verbietet.

    void push(T const& t)
    {
      t1.push(t);
    }
    


  • die getter kannst du auch const machen.

    bool empty() const
        {
            return t1.empty();
        }
    
        unsigned int size() const
        {
            return t1.size();
        }
    


  • Hi,

    für die get-Methoden habe ich zwei verschiedene Möglichkeiten gefunden die sich aber gegenseitig auszuschließen scheinen:

    Als referenz Rückgabe:

    T &front()
    	{
    		return t1.front();
    	}
    

    als Const

    T front() const
    	{
    		return t1.front();
    	}
    

    Kombiniere ich beides

    T &front() const
    	{
    		return t1.front();
    	}
    

    bekomme ich den Fehler:
    Error C2440: 'return': 'const int' kann nicht in 'int &' konvertiert werden
    Durch die Konvertierung gehen Qualifizierer verloren.

    Welche Art ist nun die Beste?



  • Beides:

    T& front()
    {
        return t1.front();
    }
    
    const T& front() const
    {
        return t1.front();
    }
    

    Dann wird die richtige Funktion gewählt, je nachdem ob das Objekt const ist oder nicht.


Anmelden zum Antworten