op<< für Ausgabe und STL-Container



  • Ich erklärs mal an Hand eines Beispiels:

    class A
    {
        public:
            typedef std::deque<int> container_type;
            typedef container_type::iterator iterator;
    
            friend ostream& operator << (ostream& stream, const A& data);
    
        private:
            std::deque<int> m_container;
    };
    
    ostream& operator << (ostream& stream, const A& data)
    {
        A::iterator runner = data.m_container.begin(); // Can't convert const_iterator into iterator
        while(runner != data.m_container.end())
        {
            cout << *runner;
            ++runner; // endlosschleife rauseditiert
        }
    
        return(stream);
    }
    

    Was tun? Okay, vielleicht ist deque nicht das beste Beispiel weils notfalls auch noch über den []-Operator ansprechbar ist. Aber das kann doch nicht sein, dass ich ein konstantes Objekt nicht ausgeben darf nur weil sich der STL-Container wehrt sich iterieren zu lassen...

    😞

    MfG SideWinder



  • Nicht einmal ein const_cast funktioniert in diesem Fall - kA wieso.

    MfG SideWinder



  • folgendes funktioniert bei mir

    class A
    {
    public:
    	typedef std::deque<int> container_type;
    	typedef container_type::const_iterator iterator; //hier const_iterator
    
    	friend ostream& operator << (ostream& stream, const A& data);
    
    	void add (int i) {m_container.push_back (i);}
    
    private:
    	std::deque<int> m_container;
    };
    
    ostream& operator << (ostream& stream, const A& data)
    {
    	A::iterator runner = data.m_container.begin(); //
    	while(runner != data.m_container.end())
    	{
    		cout << *runner++; // da hattest du ne Endlosschleife *g*
    	}
    
    	return(stream);
    }
    
    int main () {
    
    	A foo;
    	foo.add (7);
    
    	cout << foo;
    
    }
    

    Ich habe auch mal etwas rumgetestet, und habe folgendes hinbekommen

    class A
    {
    public:
    	typedef std::deque<int> container_type;
    	typedef container_type::iterator iterator;
    
    	friend ostream& operator << (ostream& stream, const A& data);
    
    	void add (int i) {m_container.push_back (i);}
    
    private:
    	std::deque<int> m_container;
    };
    
    ostream& operator << (ostream& stream, const A& data)
    {
    	std::deque<int>::iterator runner = const_cast<A&>(data).m_container.begin(); // So geht es
    	while(runner != data.m_container.end())
    	{
    		cout << *runner++;
    	}
    
    	return(stream);
    }
    
    int main () {
    
    	A foo;
    	foo.add (7);
    
    	cout << foo;
    
    }
    


  • Hat sich schon erledigt, wenn ein const_iterator auch brav durch die Liste wandern kann ist das ja gut so. Dachte schon der ist dazu nicht im Stande, aber dann wär er ja sinnlos - Denkfehler also 🙄

    BTW: Den bösen const_cast können wir uns dann auch sparen 😉

    MfG SideWinder


Anmelden zum Antworten