Erben nur gemeinsame Member kopieren



  • Hi,

    ich hab folgenden Code:

    struct parent
    {
    long x;
    long y;
    long z;
    };
    
    struct c1 : public parent
    {
    int id;
    };
    
    struct c2 : public parent
    {
    std::string name;
    }
    

    Wie kann ich jetzt x, y, z aus einem c1 Objekt in ein c2 Objekt kopieren, ohne alle Member von parent einzeln aufzuzählen. Also nicht:

    c1 myvar1;
    c2 myvar2;
    myvar2.x = myvar1.x;
    myvar2.y = myvar1.y;
    myvar2.z = myvar1.z;
    

    name und id sollten natürlich nicht geändert werden.

    MfG
    Scarabol



  • Den Zuweisungsoperator überladen und für deine Struktur neu definieren.



  • Vielleicht garnicht erst erben, sondern has-a und nicht parent, sondern coordinates nennen.



  • oder so

    c1 myvar1;
    c2 myvar2;
    
    static_cast<parent&>(myvar2) = static_cast<parent&>(myvar1);
    


  • Oder

    struct base {
       int val;
    };
    
    struct derived : base {
        using base::operator=;
    };
    

    Was aber an den ganzen Hacks abseits von einem eigenen operator= in den abgeleiteten Klassen einfach richtig schlecht ist:
    Der State eines Objekts wird nur halb geändert! Wenn das Objekt der abgeleiteten Klasse schon die eigenen Member geändert hat, und es kommt ein operator= mit einem base daher, sollten diese wieder auf einen default-Wert zurück gesetzt werden, bzw. auf einen passenden Wert in Abhängigkeit von den anderen Membern. Aber natürlich nur dann wenn es gewünscht ist - das nennt man dann "Kontrolle", und jede Klasse sollte sich soweit wie möglich selbst im Griff haben.



  • Es geht darum die Daten eines Spielers in eine Liste zu speichern.
    Die Liste enthält aber Daten die die Spielervariable nicht kennt und umgekehrt, aber beide erben von einer gemeinsamen Struktur, die eben die gemeinsamen Daten festlegt.

    Wenn ich in der gemeinsamen Struktur etwas ändere oder hinzufüge muss ich immer die LadeSpieler() und die SpeichereSpieler() Funktion bearbeiten. Dummerweise hab ich jetzt schon mal vergessen alle Variablen korrekt in den Funktionen zu hinterlegen, sodass nicht alles gespeichert wurde. Außerdem sind die Funktionen doch redundant oder?

    Könnte ich die Speicher und Laden Funktionen durch eine einzige Funktion ersetzen, indem ich swap benutze?

    MfG
    Scarabol



  • Noch nie vorher gemacht aber funktioniert irgendwie

    #include <iostream>
    
    class parent
    {
    public:
        int x;
    };
    
    class p1 : public parent
    {
    public:
        p1(){ x = 10; }
    };
    
    class p2 : public parent
    {
    public:
        p2(){ x = 12; }
    };
    
    int main()
    {
        p1 a1;
        p2 a2;
    
        std::cout << a1.x << std::endl;
    
        a1.parent::operator=(a2);
    
        std::cout << a1.x << std::endl;
    
    }
    

    Ausgabe:
    10
    12


Anmelden zum Antworten