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 fehlergeht 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 verlorengeht 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