Zufällige Klasse zuweisen


  • 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