reference return auf container vector ?
-
Ey, Du solltest wissen was Du tust...
-
xBlackKnightx schrieb:
test = &growth->gvector();
Und warum wieder den Umweg über einen Zeiger gehen? Beim Zugriff auf das Objekt muss erst dereferenziert werden.
Machs doch soQVector<Growth*> test = growth->gvector();
-
hm das funktioniert.
hoffe es wird nichts kopiert?
naja das mit containern ist mir noch nicht so klar
-
xBlackKnightx schrieb:
hoffe es wird nichts kopiert?
doch - wieso?
wegen performance?wenn ja, dann vergiss die bedenken ^^
wenn nicht: pointer
-
Oder vielleicht Referenzen, denn das gibt ja die Methode auch zurück?
-
also so:
QVector<Growth*>& vector = growth->gvector(); qDebug() << vector[4]->id();referenz auf referenz
gut ich glaub das passt
-
xBlackKnightx schrieb:
hoffe es wird nichts kopiert?
1. Was ist mit einer Kopie das Problem?
2. Wie häufig rufst du das ganze auf, wieviele Elemente enthält der Container in etwa?Kopien können ein Problem sein, aber selten. Zumal du hier keine Objekte sondern Zeiger im Container hast.
-
vlt millionen elemente
ich dachte alle elemente im container werden kopiert. oder ist der container auch nur ein zeiger?
-
xBlackKnightx schrieb:
vlt millionen elemente
ich dachte alle elemente im container werden kopiert. oder ist der container auch nur ein zeiger?Nein, es werden schon alle Elemente kopiert. Da du darin aber Zeiger hälst bin ich nicht davon ausgegangen das es in die Mio geht. Okay, dann ist eine Kopie wirklich nicht angebracht. Auch wenn ich gerne Member offenlege (und dann lieber schaue ob der Aufruf nicht in der Klasse erfolgen kann).
-
ok
trotzdem frage ich mich, wieso es nicht möglich ist, ein vector als pointer auf ein vector zu zeigen?
in der methode
QVector<Growth*> Growth::gvector() { return vector; }dann in maincode:
QVector<Growth*>* vector = &growth->gvector(); qDebug() << vector[0].id();dann kommt fehlermeldung:
error C2039: 'id': Ist kein Element von 'QVector<T>'
-
QVector<Growth*>* vector = &growth->gvector(); qDebug() << vector[0]->id();Weil "vector" ein Zeiger ist, und du da nicht einfach den Index-Operator anwenden kannst...
Was geht wäreqDebug() << (*vector)[0]->id();oder halt gleich per
qDebug() << vector->at(0)->id();gibt aber ein const-Objekt zurück.
-
okay die klammern sind es was ich immer ausgelassen hab. oh man muss ich mich damit nochmal auseinandersetzen
-
hm wieso funktioniert das nur innerhalb der methode?
in einer anderen methode der selben klasse stürzts immer ab wenn ich z.b. growth->size() mache, obwohl die adresse auf die der zeiger weist korrekt ist
-
egal haut hin
-
Hier hatte mal einer ne Signatur, die ging in etwa: "Stocherst du gern in Toten rum?" Genau das ist hier wieder der Fall.
QVector<Growth*> Growth::gvector() { return vector; }Eine Kopie von vector wird zurückgegeben.
QVector<Growth*>* vector = &growth->gvector(); // <- qDebug() << vector[0].id();Von dieser Kopie, die mit dem markierten Semikolon stirbt, nimmst du die Adresse. Jeder weitere Zugriff auf *vector ist damit undefiniert.