Zufällige Klasse zuweisen



  • Hallo Leute,

    ich möchte einer zunächst unbestimmten Instanz per Zufallsprinzip eine Klasse zuweisen bzw. diese einer KLasse zuweisen. Konkret sieht es wie folgt aus.

    Ich habe zwei Klassen Mann und Frau. Ich möchte jetzt nicht bewusst eine Instanz Mann xyz erstellen, sondern zunächst xyz allein stehen lassen und im späteren Verlauf wirklich Zufällig zu einer Instanz von Mann oder Frau machen. Gibt es da eine Möglichkeit?

    Kann man da mit function Templates arbeiten. Ich weiß zwar in etwa wie diese funktionieren, aber so ganz erschließt sich mir der Sinn dann doch nicht. Oder ist das der falsche Weg?

    Gruß
    pluxyy


  • Mod

    pluxyy schrieb:

    Kann man da mit function Templates arbeiten. Ich weiß zwar in etwa wie diese funktionieren, aber so ganz erschließt sich mir der Sinn dann doch nicht. Oder ist das der falsche Weg?

    Vielleicht, vielleicht nicht. Mir fallen mehrere verschiedene Möglichkeiten ein, wie man das machen könnte und mir fallen noch viel Möglichkeiten ein, wieso du wahrscheinlich die falsche Frage stellst. Je genauer du dein eigentliches Problem beschreibst, desto besser kann man dir helfen.


  • Mod

    pluxyy schrieb:

    Ich habe zwei Klassen Mann und Frau. Ich möchte jetzt nicht bewusst eine Instanz Mann xyz erstellen, sondern zunächst xyz allein stehen lassen und im späteren Verlauf wirklich Zufällig zu einer Instanz von Mann oder Frau machen.

    Und was ist xyz in der Zwischenzeit? Als was soll es verwendet werden?



  • xyz ist zunächst undefiniert. Es wird ja zunächst auch nicht gebraucht. was ich will ist etwas in Richtung

    random_class(Mann oder Frau) xyz;
    Ich will nur, dass es keine Beeinflussung seitens des Programmierers gibt, welche Klasse ausgewählt wird.

    Ich sags mal so, zunächst ist xyz vllt. einfach nur ein Mensch (evtl. auch eine Klasse) und irgenwann wird per Zufallsprinzip entschieden, dass xyz z.B. ein Mann (evtl. Mann-Klasse Kindklasse von Mensch ) sein soll. Dann hat xyz andere Eigenschaften.


  • Mod

    SeppJ schrieb:

    Je genauer du dein eigentliches Problem beschreibst, desto besser kann man dir helfen.

    Du bemühst dich gerade, das Gegenteil zu erreichen.



  • Hmm, spontan würde ich sagen du brauchst eine Basisklasse Mensch, von der Mann und Frau erben. Dadurch hättest du dann eine Variable xyz vom Typ Mensch, der du random eine Instanz entweder von Mann oder Frau zuweisen kannst. Allerdings kann der Zugriff auf spezielle Klassenfunktionen recht umständlich sein, weil du dafür xyz unter Umständen direkt casten musst.
    Beschreib mal das Problem genauer, also was du damit erreichen willst und warum, dann kann man besser helfen.



  • Eine Basisklasse Mensch wollte ich auch vorschlagen. Da kannst du dann ausser Mann und Frau auch noch nachträglich Zwischenstadien hinzufügen.



  • Eine Variable mit mehreren möglichen Typen kann man zum Beispiel mit variant erreichen:

    //optional, damit nicht standardmäßig ein "Mann" konstruiert wird
    boost::optional<boost::variant<Mann, Frau>> xyz;
    ...
    
    if (irgendwas)
    {
      xyz = Mann();
    }
    else
    {
      xyz = Frau();
    }
    


  • class C1 { public: string s = "C1"; };
    class C2 { public: string s = "C2"; };
    class C : C1, C2 {};
    
    int main(void)
    {
      int i = 0;
      while (i++ < 10)
      {
        int r = rand()%2;
        C* p = r ? (C*)(new C1) : (C*)(new C2);
        cout << (r ? ((C1*)p)->s : ((C2*)p)->s) << "\n";
      }
    }
    


  • klassenmethode schrieb:

    class C1 { public: string s = "C1"; };
    class C2 { public: string s = "C2"; };
    class C : C1, C2 {};
    
    int main(void)
    {
      int i = 0;
      while (i++ < 10)
      {
        int r = rand()%2;
        C* p = r ? (C*)(new C1) : (C*)(new C2);
        cout << (r ? ((C1*)p)->s : ((C2*)p)->s) << "\n";
      }
    }
    

    löl.
    Dem habe ich nichts hinzuzufügen, außer der Kleinigkeit, '\n' statt "\n" zu nehmen.



  • oder meint er so was?

    class D { public: virtual string f(void){} };
    class D1 : D { public: string f(void){ return "D1"; } };
    class D2 : D { public: string f(void){ return "D2"; } };
    
    int main(void)
    {
      int i = 0;
      while (i++ < 10)
      {
        D* q = rand()%2 ? (D*)(new D1) : (D*)(new D2);
        cout << q->f() << endl;
      }
    }
    


  • Du hast die Smartpointer vergessen 🤡



  • Und bitte nicht (void) schreiben, wenn in C++ () dasselbe aussagt. Plattenplatz ist teuer.



  • warum wäre sowas jetzt eine schlechte Idee?

    enum class Geschlecht {
        Mann, Frau
    }
    
    class Mensch {
        Mensch(Geschlecht geschlecht);
    // ...
        Geschlecht geschlecht;
    }
    
    // ....
    auto geschlecht = static_cast<Geschlecht>(<random int between 0 and 1>);
    Mensch mensch(geschlecht)
    

  • Mod

    HarteWare schrieb:

    warum wäre sowas jetzt eine schlechte Idee?

    Wir wissen es nicht. Der Threadersteller wurde mehrmals nach Details gefragt, hat aber nicht geliefert. Welche der vielen möglichen Lösungen passend ist, kann daher nicht gesagt werden.



  • Entschuldigt bitte, dass ich mich jetzt erst wieder melde. Das war unhöflich von mir. klassenmethode's Anwort war vollkommen ausreichen, vielen dank dafür!

    Gibt es hier eigentlich ein Belohungs bzw. Bewertungsystem? Dann könnte ich auch einen kleinen Tribut zollen 😉



  • Aber ernsthaft, er hat die Smartpointer vergessen.


Anmelden zum Antworten