reference return auf container vector ?



  • in der klasse gibt es eine methode:

    QVector<Growth*>& Growth::gvector() {
    	return vector;
    }
    

    und wollt jetzt außerhalb so

    QVector<Growth*>* test;
    test = growth->gvector();
    

    aber:

    .\main.cpp(15) : error C2440: '=': 'QVector<T>' kann nicht in 'QVector<T> *' konvertiert werden
    with
    [
    T=Growth *
    ]
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden

    das hier alleine growth->gvector(); funktioniert auch nicht

    Das ganze ist so: In der Klasse wird ein vector außerhalb Methode und Konstruktor erstellt. Dieser soll über Zeiger von Außen zugegriffen werden

    QVector ist von Qt und dasselbe wie Vector.



  • xBlackKnightx schrieb:

    ...

    'QVector<T>' kann nicht in 'QVector<T> *' konvertiert werden

    Was ist daran nicht zu verstehen?

    Deine Funktion gvector liefert eine Referenz zurück, die du einem Zeiger zuweist.

    cu André



  • ah dann hab ich nur & vergessen

    test = &growth->gvector();

    edit: funktionieren tuts trotzdem nicht

    scheisse kompliziert...
    aber das geht: growth->gvector()[3]->id();



  • 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 so

    QVector<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äre

    qDebug() << (*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.


Anmelden zum Antworten