Seltsames Referenz Verhalten ...


  • Administrator

    ... zumindest aus meiner Sicht.

    Ich habe eine Funktion, welche eine Referenz auf ein Objekt zurückgibt. Das Objekt ist eine Struktur. In dieser Struktur schreibe ich, doch im eigentlichen Objekt, werden die Änderungen nicht übernommen. Kleines Codebeispiel:

    SRank& refRank = SRank();
    
    // ...
    for(int i = 0; i < m_RankArray.GetCount(); ++i)
    {
        refRank = m_RankArray.GetAt(i);
    
        if(refRank.pTeam == pCheckTeam)
        {
            refRank.nGoalsmade += 1;
            // ...
        }
    }
    

    m_RankArray ist eine CArray Klasse aus der MFC, spielt derzeit keine Rolle. GetAt(i) liefert eine Referenz auf ein Struct SRank zurück an der Stelle i.
    Wenn ich jetzt eben z.b. nGoalsmade in der Struktur verändere, dann wird es im Original seltsamerweise nicht auch verändert. Kann mir da jemand sagen, woran das liegen könnte?

    Grüssli



  • Referenzen kann man nicht kopieren. Du kopierst den Inhalt des Objektes dessen Referenz GetAt(i) zurückgibt auf das Objekt dessen Referenz SRank() zurückgegeben hat.


  • Administrator

    Das heisst:

    CIrgendwas& M::Funktion()
    {
        return m_Irgendwas;
    }
    
    CIrgendwas& a = CIrgendwas();
    a = Funktion();
    
    // Ist ungleich ...
    
    CIrgendwas& a = Funktion();
    

    😕

    Grüssli



  • Exakt.

    Eine Referenz kann nur einmal initialisiert werden (und sie darf nicht nicht initialisiert werden). Danach hast Du einfach ein Objekt, bei dem die normale Zuweisungs-Semantik greift. Anders wäre aber auch schwer vorherzusehen, was Du möchtest. Stell Dir folgendes Beispiel vor:

    int& zahl() {
      static int zahl;
      return zahl;
    }
    
    int a = 10;
    int& x = zahl();
    
    x = 10; // Ist noch eindeutig
    x = a;  // Huch, möchtest Du die Referenz ändern damit x auf a zeigt, oder möchtest Du den Wert auf den x jetzt gerade zeigt ändern?
    

  • Administrator

    Danke ... zwar spät, aber hatte leider viel zu tun. ^^

    Noch kurz eine Frage. Und zwar durchlaufe ich in einem Programm immer viele Listen. Dies passiert in einem Aktualisierungszyklus, welcher möglichst schnell ablaufen sollte. Meine Kopierkonstruktoren, bzw. kopieroperatoren sind aber teilweise sehr lang, da ich sehr grosse Klassen mit vielen Informationen habe. Deshalb kam ich auch auf die Idee eine Referenz zu erstellen. Nun muss ich aber für jedes Objekt die Referenz neu initialisieren.

    for(...)
    {
        CIrgendwas& refIrgendwas = IrgendwasArray.GetAt(i);
    }
    

    Was braucht nun mehr Zeit?
    Das kopieren oder das anlegen der Referenz?
    Wie könnte ich das sinnvoll testen?
    Oder ist das ganze klar, was schneller ist?

    Grüssli und nochmals danke.



  • Das Kopieren benötigt vermutlich mehr Zeit - zum Anlegen der Referenz muß nur die Adresse des Objekts hinterlegt werden (und die implizite Dereferenzierung, wenn du darauf zugreifen willst, dürfte auch nicht sehr lange dauern).


  • Administrator

    ok danke ... Wieder mal einiges gelernt ^^

    Grüssli


Anmelden zum Antworten