Lässt Container nur konstante Objekte zu?



  • Ich habe mit Container ein paar Objekte hinzugefügt.

    Ich wollte jetzt ein paar Werte dazufügen z.b.

    KontoVec::const_iterator pos;  
    
       for( pos = v.begin(); pos < v.end(); pos++)
    	   pos->setNr(5); // <- hier der fehler
    

    geht aber nicht es steht was von

    error C2662: 'Konto::setNr': this-Zeiger kann nicht von 'const Konto' in 'Konto &' konvertiert werden
    Durch die Konvertierung gehen Qualifizierer verloren

    geht das nur mit konstanten Objekten?



  • Du hast bereits ein konstantes Objekt (wegen const_iterator). Logischerweise darfst Du das Objekt nicht ändern, wenn es konstant ist.



  • hm dann hab ich halt so gemacht:

    vector<Object> objlist;
    	objlist.push_back(Object());
    
    	for ( unsigned int i=0; i < objlist.size(); i++ ){
    		cout << objlist[i].getPosX() << "\n";
    	}
    

    geht zwar aber mir fällt da was anderes auf:

    jedes mal wenn objlist.push_back(Object()); ausgeführt wird, wird der Destruktor von Objekt aufgerufen. Sehe ich zumindest in der Konsole.

    Irgendwie gefällt mir das nicht. Es wird hier scheinbar immer ein Objekt erzeugt, kopiert und das was in argument von push_back ist, "Object()" wieder zerstört. Weil in Destruktor sind Funktionen drin. Das ist rechenaufwändiger. Habe ich recht ?



  • hm ich habe jetzt so gemacht:

    Object* p_obj = NULL;
    	p_obj = new Object;
    
    	vector<Object*> objlist;
    	objlist.push_back(p_obj );
    	p_obj = new Object;
    	objlist.push_back(p_obj );
    // usw...
    
    	for ( unsigned int i=0; i < objlist.size(); i++ ){
    		cout << objlist[i]->getPosX() << "\n";
    	}
    

    eine vectorliste aus zeigern geht auch oder?



  • jo musst aber nachher auch wieder freigeben ...



  • guck dir die boost pointer container an, bzw. verwenden shared_ptr



  • std::vector<foo> vec_data;
    
    void foo(std::vector<foo> const& data)
    {
        for (std::vector<foo>::const_iterator it(data.begin()); it != data.end(); ++it)
            // use const. iterator (*it) == :clown:  const foo&
    
        // for (std::size_t i(0); i < data.size(); ++i)
        //     // use data[0] == const foo&
    }
    
    void bar(std::vector<foo>& data)
    {
        for (std::vector<foo>::iterator it(data.begin()); it != data.end(); ++it)
            // use iterator (*it) == foo&  
    
        // for (std::size_t i(0); i < data.size(); ++i)
        //     // use data[i] == foo&
    }
    

    So sieht das wohl aus 😉



  • hustbaer schrieb:

    guck dir die boost pointer container an, bzw. verwenden shared_ptr

    gibt es da Vorteile im gegensatz zu meiner idee ?

    (D)Evil schrieb:

    std::vector<foo> vec_data;
    
    void foo(std::vector<foo> const& data)
    {
        for (std::vector<foo>::const_iterator it(data.begin()); it != data.end(); ++it)
            // use const. iterator (*it) == :clown:  const foo&
    
        // for (std::size_t i(0); i < data.size(); ++i)
        //     // use data[0] == const foo&
    }
    
    void bar(std::vector<foo>& data)
    {
        for (std::vector<foo>::iterator it(data.begin()); it != data.end(); ++it)
            // use iterator (*it) == foo&  
    
        // for (std::size_t i(0); i < data.size(); ++i)
        //     // use data[i] == foo&
    }
    

    So sieht das wohl aus 😉

    irgendwie verstehe ich das nicht so ganz
    worum geht es da? wie wende ich es an?

    ich kann std::vector<foo>::iterator nicht schreiben da compiler es nicht kennt scheinbar. nur const_iterator

    der fehler kommt so raus

    ITERAT_T.CPP
    error C2664: 'std::_Vector_iterator<_Ty,_Alloc>::_Vector_iterator(const std::_Vector_iterator<_Ty,_Alloc> &)': Konvertierung des Parameters 1 von 'std::_Vector_const_iterator<_Ty,_Alloc>' in 'const std::_Vector_iterator<_Ty,_Alloc> &' nicht möglich
    with
    [
    _Ty=Konto,
    _Alloc=std::allocator<Konto>
    ]
    Ursache: Konvertierung von 'std::_Vector_const_iterator<_Ty,_Alloc>' in 'const std::_Vector_iterator<_Ty,_Alloc>' nicht möglich
    with
    [
    _Ty=Konto,
    _Alloc=std::allocator<Konto>
    ]
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden



  • Der Compiler meckert weil du irgendwo von einem const_iterator auf einen iterator wechseln willst. Aus einem Konstanten vector kannst du nur konstante iteratoren und daher nur konstante Objekte bekommen. Wenn du uns allerdings deinen Code nicht zeigst können wir nur raten wo der Fehler liegen mag.



  • pumuckl schrieb:

    Der Compiler meckert weil du irgendwo von einem const_iterator auf einen iterator wechseln willst. Aus einem Konstanten vector kannst du nur konstante iteratoren und daher nur konstante Objekte bekommen. Wenn du uns allerdings deinen Code nicht zeigst können wir nur raten wo der Fehler liegen mag.

    oops! tatsächlich

    hatte const in argument nicht bemerkt "void display(const KontoVec& v)"

    danke für die klarstellung


Anmelden zum Antworten