Wie kann ich mehrere Zeiger "returnen"?



  • Hallo,

    ich hätte gerne eine Funktion, die mir nicht nur einen sonder mehrere Zeiger auf Instanzen der Klasse "MeineKlasse" wiedergibt. Nur fehlt mir da das Wissen, wie so etwas Syntaktisch korrekt umzusetzten ist. Mein C++ Anfänger Buch gibt da leider auch nichts her 😞

    Suchen tue ich quasie so etwas:

    MeineKlasse*[2] function () {
      MeineKlasse* array[2] = {instanz1, instanz2};
      return array;
    }
    

    Ich würd mich freuen, wenn ihr mir zeigen würdet, wie's richtig geht..



  • std:pair sollte zwei Werte aufnehmen koennen.



  • Eine mögliche Lösung (für n Zeiger):

    #include <vector>
    
    // ...
    
    std::vector<MeineKlasse*> foo()
    {
      // ...
      std::vector<MeineKlasse*> v;
      v.push_back(instanz1);
      v.push_back(instanz2};
      return v;
    }
    


  • Ansonsten kannst du zusätzliche Zeiger auf Zeiger oder Referenzen auf Zeiger
    übergeben, die du dann in der Funktion verändern kannst.

    Mal ne andere Frage.
    Wird der (Inhalt von) std::vector in dem Beispiel von asc wirklich kopiert oder
    wird sowas i.d.R. von einem Compiler wegoptimiert?
    Also ich meine Übernehmen der Speicherbereiche auf dem Heap anstelle von
    neu alloziieren und Kopieren der Inhalte und löschen des alten Speicherbereichs?

    Gruß,
    Newbie



  • Newbie19 schrieb:

    Mal ne andere Frage.
    Wird der (Inhalt von) std::vector in dem Beispiel von asc wirklich kopiert oder
    wird sowas i.d.R. von einem Compiler wegoptimiert?

    kommt darauf an, was für einen Compiler du benutzt und wie du die Funktion aufrufst. Der GNU C++ Compiler kann alle unnötigen Kopien wegoptimieren, wenn Du sie zB so aufrufst:

    vector<MeineKlasse*> pv = foo();
    

    Das heißt, die Funktion foo konstruiert/füllt direkt den Vektor pv. (ist aber nicht vom C++ Standard garantiert).

    Wenn's aber immer nur zwei Zeiger sind, würde ich dafür std::pair nehmen.



  • Newbie19 schrieb:

    Mal ne andere Frage.
    Wird der (Inhalt von) std::vector in dem Beispiel von asc wirklich kopiert oder
    wird sowas i.d.R. von einem Compiler wegoptimiert?
    Also ich meine Übernehmen der Speicherbereiche auf dem Heap anstelle von
    neu alloziieren und Kopieren der Inhalte und löschen des alten Speicherbereichs?

    Moderne Compiler sind fähig, unter gewissen Bedingungen RVO bzw. NRVO (Named Return Value Optimization) anzuwenden und somit unnötige Kopien wegzulassen.


Anmelden zum Antworten