Membervariablen einer Klasse mit Schleife initialisieren?!



  • Hey,
    ich bin neu hier und habe nirgens einen passenden Thread gefunden... Ich verscuhe mal mein Problem zu schildern. Ich habe eine Klasse definiert, die relativ viele Membervariablen enthält. Diese werden nicht einfach initialisiert, sondern sollen vom Benutzer abgefragt werden. Nun möchte ich aber nicht für jede Variable eine extra Abfrage schreiben müssen. Geht das überhaupt?

    class CSpieler
    {
    private:
    int a;
    int b;
    int c;
    int d;
    int e;
    ....
    
    public:
    CSpieler();
    };
    
    CSpieler::CSpieler()
    {
    cout << "Neuer Spieler erstellt!" << endl;
    //Hier sollen jetzt die Variablen initialisiert werden!
    //
    }
    

    any ideas?


  • Mod

    Besteht ein Zusammenhang zwischen den Variablen?

    Falls ja: Nicht einzeln, sondern in einem Container speichern und Schleife drüberlaufen lassen

    Falls nein: Allgemeine Abfragefunktion mit anpassbarer Frage, Fehlerkontrolle & Co schreiben.



  • Erst einmal danke für die fixe Antwort.
    Also es ist so gedacht:
    Bei dem "Spieler" den die Klasse beschreibt, handelt es sich um einen Basketballspieler. Die Variablen stellen seine Stärken in gewissen Bereichen da. Beispielsweise
    int m_Wurf;
    int m_Pass;
    etc.
    Ich könnte jetzt natürlich alle Variablen die zur Offensive und alle die zur Deffensive gehören zusammenfassen und in eine Struktur oder so schreiben. Trotzdem reicht mein Wissen zur Zeit noch nicht aus um zu wissen wie ich es schaffen, dass eine Schleife sozusagen "automatisch" alle Integers durchläuft und noch die jeweils passende Frage ausgibt... Quasi:
    "Welche Wurfstärke hat der Spieler?" -> Eingabe des Wertes furch Benutzer
    "Wie gut ist der Pass des Spielers?" -> "
    usw.
    Ich hoffe ich konnte das noch einmal konkretisieren



  • Ungetest soetwas:

    class CSpieler 
    { 
    private: 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
    .... 
    
    public: 
    CSpieler(); 
    }; 
    
    CSpieler::CSpieler(int _a, int _b, int _c, int_d, int _e, ...) : a(_a), b(_b), c(_c), d(_d), e(_e),....
    { 
    cout << "Neuer Spieler erstellt!" << endl; 
    
    }
    
    void CreateSomePlayer( std::vector<CSpieler> & collection )
    {
      bool loop = true;
    
      while(loop) {
    
      int A;
      std::cout << "A?";
      std::cin >> A;
    
      int B;
      std::cout << "B?";
      std::cin >> B;
    
      ....
    
      collection.insert(Player(A, B, C, D, E,...));
    
      std::cout << "Wollen Sie ein Spieler anlegen? Ja -> 1, Nein -> 0";
      std::cin >> loop;
    
     };
    
    }
    

  • Mod

    r0mmen schrieb:

    Erst einmal danke für die fixe Antwort.
    Also es ist so gedacht:
    Bei dem "Spieler" den die Klasse beschreibt, handelt es sich um einen Basketballspieler. Die Variablen stellen seine Stärken in gewissen Bereichen da. Beispielsweise
    int m_Wurf;
    int m_Pass;
    etc.
    Ich könnte jetzt natürlich alle Variablen die zur Offensive und alle die zur Deffensive gehören zusammenfassen und in eine Struktur oder so schreiben. Trotzdem reicht mein Wissen zur Zeit noch nicht aus um zu wissen wie ich es schaffen, dass eine Schleife sozusagen "automatisch" alle Integers durchläuft und noch die jeweils passende Frage ausgibt... Quasi:
    "Welche Wurfstärke hat der Spieler?" -> Eingabe des Wertes furch Benutzer
    "Wie gut ist der Pass des Spielers?" -> "
    usw.
    Ich hoffe ich konnte das noch einmal konkretisieren

    Wenn es sich nicht um mehrere Werte von einer Art handelt, so ist es eigentlich weniger empfehlenswert, diese in einer Schleife zu behandeln. Denn im Prinzip ändert sich bei jedem Durchlauf der Schleife alles was die Schleife überhaupt machen würde: Der ausgegebene Text und die eingelesene Variable. Wenn es unbedingt sein muss, kann man so etwas wie von dir beschriebene zwar machen (mit Makros), aber das ist eher Trickserei und absolut nichts für Anfänger die einfach nur Schreibarbeit sparen wollen. Dafür könntest du dir eine Funktion schreiben:

    void stelle_frage_und_lese_wert(const std::string &beschreibung, int &wert)
    {
      std::cout << "Geben Sie einen Wert für " << beschreibung << " ein: " << std::flush;
      std::cin >> wert;
    }
    

    Oder etwas allgemeiner (falls dir Templates schon etwas sagen):

    template <typename T> void stelle_frage_und_lese_wert(const std::string &beschreibung, T &wert)
    {
      std::cout << "Geben Sie einen Wert für " << beschreibung << " ein: " << std::flush;
      std::cin >> wert;
    }
    

    Beide Varianten sind nach diesem Schema verwendbar:

    stelle_frage_und_lese_wert("die Wurfstärke",wurfstaerke);
    


  • struct WERT
    {
         WERT(std::string bezeichnung):wert(0){}
         int wert;
         std::string bezeichnung;
    
    };
    
    [...]
    
    vec.push_back(WERT("pass"));
    vec.push_back(WERT("Wurfstärke"));
    usw.
    
    [...]
    
    for(int i; i < vec.size(); ++i)
    {
         cout << "wert für " vec[i].bezeichnung << " eingeben: ";
         // dein eingabekram hier
    }
    

    wäre eine Möglichkeit deinen Kram zu machen.



  • SeppJ schrieb:

    ..._lese_...
    

    -> "lies" ! 😉

    wie auch "hilf", "sprich", "gib", "wirf", ....

    Sorry, aber dies macht mich waaaaaahnsinnig.

    Gruß,

    Simon2.



  • Hey!
    Klasse wie viele Antworten es hier regnet!
    Vielen Dank dafür schon einmal! Ich werde es gleich mal ausprobieren und schaun, was die beste Lösung für mein Problem ist!


Anmelden zum Antworten