Referenz als Rückgabeparameter



  • struct store
    {
     int rtti;
     std::string name;
     //...
    };
    
    class Storage
    {
    public:
    	std::vector<store>  &getData() { return data; };
    
    private:
    	static std::vector<store>  data;
    };
    
    //...
    
    void Output::Methode();
    {
    Storage storage;
    /* Werte ändern */
        std::vector<store> data = storage.getData();
        std::vector<store>::iterator it;
    
         for (it=data.begin(); it != data.end(); ++it) 
           {
              it->rtti = 23;
              it->name = "Hello World";
           }
    
    /* Werte ausgeben */
        std::vector<store> a_data = storage.getData();
        std::vector<store>::iterator a_it;
    
         for (a_it=a_data.begin(); a_it != a_data.end(); ++a_it) 
           {
             std::cout << a_it->rtti << a_it->name << std::endl;
           }
    
    }
    

    In Data sind schon Werte drin beim Start jetzt will ich die in der Methode die Werte Ändern dabei soll natürlich kein neues Object erstellt werden da ja dann das kopierte Object die Änderung besitzt und nicht das original Object.
    Jetzt wollte ich eine Referenz zurückgeben. Funktioniert irgendwie nicht.Da in der Ausgabe nicht die Änderung ausgibt sondern den Start Wert ausgeben wird. Was mache ich falsch ?

    MFG
    xmarvel



  • Storage storage; //eine neue instanz von storage erstellen
    /* Werte ändern */ 
        std::vector<store> data = storage.getData();//data ist nun leer weil in storage nichts drin sein dürfte(ausser im ctor wird was gemacht) 
        std::vector<store>::iterator it; 
    
         for (it=data.begin(); it != data.end(); ++it)//in data etwas reinschreiben 
           { 
              it->rtti = 23; 
              it->name = "Hello World"; 
           } 
    
    /* Werte ausgeben */ 
        std::vector<store> a_data = storage.getData();//a_data ist wieder leer 
        std::vector<store>::iterator a_it; 
    
         for (a_it=a_data.begin(); a_it != a_data.end(); ++a_it)//leeren vector ausgeben 
           { 
             std::cout << a_it->rtti << a_it->name << std::endl; 
           }
    

    du musst data zur referenz machen sonst findet wieder ein kopieren des vectors statt



  • danke für die schnelle Antwort 🙂
    Jetzt funktioniert es leider denke ich das ich es noch nicht richtig verstanden habe deswgen habe ich noch ein paar Fragen diesbezüglich.

    Storage storage; // Werte werden im CTor initialisiert also es sind einige Daten drin in der Variable data.
    /* Werte ändern */
        std::vector<store> &data = storage.getData();/* Mit dem & funktioniert es da wird ja jetzt die lokale Variable data als referenz gemacht oder ? 
     Wenn das & weg wäre würde wieder eine Kopie vom data erstellt werden oder ? */
        std::vector<store>::iterator it;
    
         for (it=data.begin(); it != data.end(); ++it)//in data etwas reinschreiben
           {
              it->rtti = 23;
              it->name = "Hello World";
           }
    
    /* Werte ausgeben */
        std::vector<store> a_data = storage.getData();/* Jetzt wollte ich hier auch eine Referenz also & bei a_data machen jetzt bekomme ich 
    dabei aber ein dicken Speicherzugriffsfehler nur wieso ? Muss bei der Ausgabe eine Kopie erstellt werden ? */
        std::vector<store>::iterator a_it;
    
         for (a_it=a_data.begin(); a_it != a_data.end(); ++a_it)
           {
             std::cout << a_it->rtti << a_it->name << std::endl;
           }
    

    Wäre nett wenn mir jemand die Fragen noch beantworten könnte.

    MFG
    xmarvel


Anmelden zum Antworten