Frage zur Rückgabe von const-Liste mit Smart-Pointern



  • Hiho,

    folgende Ausgangslage: ich habe eine Klasse, welche mehrere Heapobjekte in einer Liste verwaltet. Die Liste benutzt dazu Smartpointer aus boost. Nun möchte ich die Liste nach außen geben, damit andere LESEND darauf zugreifen können.
    Folgender Beispielcode, der das veranschauchlicht:

    class WithSharedPtr
    {
    	public:
    		//
    		typedef std::list<boost::shared_ptr<int>> IntList;
    
    		//
    		WithSharedPtr()
    		{
    			m_spList.push_back(boost::make_shared<int>(3));
    			m_spList.push_back(boost::make_shared<int>(5));
    		}
    
    		//
    		const IntList& getListPtr() const { return m_spList; }
    
    	private:
    		//
    		IntList m_spList;
    };
    
    int main()
    {
    	WithSharedPtr ptr;
    	*ptr.getListPtr().front() = 2;
    ...
    }
    

    Wie man nun sieht, kann ich die Objekte der Smartpointer ändern. Warum, das ist mir klar. Meine Frage ist: wie kann man das am besten lösen, das ich die Liste herausgebe und verhinder, dass der Aufrufer die Objekte verändern kann? Bisher ist mir nur eingefallen eine zweite Liste auf const int* (wenn ich beim Bsp. bleibe) zu erzeugen, die Smartpoinetr zu kopieren und diese Liste herauszugeben. Aber ich will an sich nicht eine zweite Liste erzeugen.

    VG

    Pellaeon


  • Mod

    proxy



  • siehe http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/indirect_iterator.html

    class WithSharedPtr {
      ...
    
      typedef boost::indirect_iterator<
                std::list<boost::shared_ptr<int> >::const_iterator,
                const int // <-- man beachte das 'const' hier
              > const_iterator;
    
      const_iterator begin() const {return const_iterator(this->IntList.begin());}
      const_iterator end()   const {return const_iterator(this->IntList.end());  }
    
      ...
    };
    

    (ungetestet)



  • - mist -



  • Danke für die Tipps. Das mit dem indirect_iterator klappt wunderbar und ist schneller getippt als einen eigenen Proxy zu schreiben 😃


Anmelden zum Antworten